堆棧是一種只容許在表的一端(稱爲棧頂)進行插入和刪除的線性表,而在表的另外一端(稱爲棧底)是不能進行操做的,也是線性表的一種特例。數組
堆棧的順序存儲是用數組來是實現的。爲了表示棧,咱們須要一個棧頂指針top來指示棧頂位置。下面的代碼實現了對順序棧的相關操做。指針
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 typedef struct { int data[MAXSIZE]; int top; //棧頂指針 }sqstack; sqstack *Sqstack_Create(); //建立堆棧 int Sqstack_GetTop(sqstack *q); //取得棧頂 int Sqstack_In(sqstack *q, int dat); //入棧 int Sqstack_Out(sqstack *q); //出棧 void Sqstack_SetNull(sqstack *q); //棧置空 int Sqstack_Empty(sqstack *q); //判斷棧是否空 void ShowSqstack(sqstack *q); //輸出顯示堆棧 int main(atevoid) { sqstack *q; int choice; int ans, dat; printf("順序棧操做練習:\n"); q = Sqstack_Create(); while(1) { printf("順序棧相關操做:\n"); printf("1.取棧頂結點\n"); printf("2.入棧\n"); printf("3.出棧\n"); printf("4.輸出顯示棧\n"); printf("5.退出程序\n"); printf("作出選擇:"); scanf("%d", &choice); switch(choice) { case 1: ans = Sqstack_GetTop(q); if(ans == -1) printf("取棧頂結點失敗!\n"); else printf("棧頂結點爲%d\n", ans); break; case 2: printf("輸入你想入棧的數據:"); scanf("%d",&dat); ans = Sqstack_In(q, dat); if(!ans) printf("入棧失敗\n"); else printf("入棧成功\n"); break; case 3: ans = Sqstack_Out(q); if(ans == -1) printf("出棧失敗!\n"); else printf("出棧成功!\n"); break; case 4: ShowSqstack(q); break; case 5: return 0; break; default: printf("選擇無效!\n"); break; } } return 1; } //置空棧 void Sqstack_SetNull(sqstack *q) { q->top = -1; //空棧時棧頂指針爲-1 } //判斷堆棧是否空 int Sqstack_Empty(sqstack *q) { if(q->top == -1) //堆棧棧頂爲-1則爲空 return 1; else return 0; } //堆棧建立 sqstack *Sqstack_Create() { sqstack *q; int num, i; q = (sqstack*)malloc(sizeof(sqstack)); Sqstack_SetNull(q); printf("輸入想建立堆棧數據的個數:"); scanf("%d", &num); if(num>MAXSIZE-1) return NULL; printf("依次輸入堆棧的數據:"); for(i=0;i<num;i++) { scanf("%d", &q->data[i]); q->top++; } return q; } //取得棧頂 int Sqstack_GetTop(sqstack *q) { if(Sqstack_Empty(q)) //先要判斷是否爲空棧 return -1; else return q->data[q->top]; } //入棧 int Sqstack_In(sqstack *q, int dat) { if(q->top == MAXSIZE-1) //先要判斷堆棧是否已滿 return 0; else { q->top += 1; q->data[q->top] = dat; return 1; } } //出棧 int Sqstack_Out(sqstack *q) { if(Sqstack_Empty(q)) //先要判斷堆棧是否爲空 return -1; else return q->data[q->top--]; } //輸出顯示堆棧 void ShowSqstack(sqstack *q) { int i; for(i=0; i<=q->top; i++) { printf("%d ", q->data[i]); } printf("\n"); }