用C語言實現棧以及棧的簡單操作
阿新 • • 發佈:2019-01-14
一 棧的定義:
棧(堆疊)是一種線性表,它的特點是僅允許在棧的一端進行插入、刪除等操作。棧底固定,棧頂浮動。其特性為後進先出。一般棧中元素為0時,稱為空棧。它有兩種實現方式,順序棧與鏈棧,下面將簡單的說明一下順序棧及鏈棧的生成與簡單操作。
棧的簡單操作如圖所示:(top從0到3的改變體現著入棧與出棧)
二 順序棧:
順序棧:靜態棧,以順序表的方式實現棧以及棧的簡單操作。順序棧的模型為:
順序棧的見到操作的具體程式碼如下所示:
標頭檔案:
#include<stdio.h> #include<assert.h> #include<windows.h> typedef int SDataType; typedef struct Stack { SDataType array[100]; int top; //此處的array[top]表示下一個可用位置 //此處的array[top-1]表示棧頂元素位置 //top表示棧裡現在有多少資料 } Stack; // 初始化 Stack* StackInit(Stack *pStack); // 壓棧 void StackPush(Stack *pStack, SDataType data); // 出棧 void StackPop(Stack *pStack); // 返回棧頂元素 SDataType StackTop(Stack *pStack); // 判斷是否為空 // 1 空 // 0 不空 int StackIsEmpty(Stack *pStack); // 返回資料個數 int StackSize(Stack *pStack); //列印棧 void StackPrint(Stack *pStack); // 初始化 Stack* StackInit(Stack *pStack) { //Stack * pStack1 = (Stack *)malloc(sizeof(Stack)); //assert(pStack1 != NULL);//確定棧建立成功,如果pStack == NULL,整個程式直接退出 pStack->top = 0;//棧裡的資料個數為0 return pStack; } // 壓棧 // 壓棧就是讓棧頂元素等於所要入棧的元素,再讓top++;(前提條件是棧未滿) void StackPush(Stack *pStack, SDataType data) { assert(pStack != NULL); assert(pStack->top < 100); pStack->array[pStack->top] = data; pStack->top++; } // 出棧 // 出棧的前提是棧裡有元素,然後只需要讓棧頂指標減減 void StackPop(Stack *pStack) { assert(pStack != NULL); assert(pStack->top >0); pStack->top--; } // 返回棧頂元素 // 前提是棧中有元素,需要將棧頂指標減減 int StackTop(Stack *pStack) { assert(pStack != NULL); assert(pStack->top > 0); pStack->top--; return(pStack->array[pStack->top]); } // 判斷是否為空 // 1 空 // 0 不空 int StackIsEmpty(Stack *pStack) { assert(pStack != NULL); if (pStack->top == 0) return 1; else return 0; } // 返回資料個數 int StackSize(Stack *pStack) { assert(pStack != NULL); pStack->top++; return (pStack->top); } //列印棧 void StackPrint(Stack *pStack) { int i = pStack->top; while (i != 0) { printf("%d ", pStack->array[i-1]); i--; } printf("\n"); }
.c檔案:
#include"stack.h" void test() { Stack pStack1; StackInit(&pStack1); StackInit(&pStack2); StackPush(&pStack1,1); StackPush(&pStack1,3); StackPush(&pStack1,5); StackPush(&pStack1,7); StackPrint(&pStack1); StackPop(&pStack1); StackPop(&pStack1); StackPrint(&pStack1); int p = StackTop(&pStack1); printf("棧頂元素為:%d\n", p); int p1 = StackIsEmpty(&pStack1); printf("%d\n", p1); int p2 = StackSize(&pStack1); printf("棧內有%d個元素\n", p2); } int main() { test(); system("pause"); return 0; }
關於棧的一些內容,若有不對,還請指正。