棧是限定僅在表尾進行插入和刪除的線性表,對錶尾端稱做棧頂,表頭端稱做棧底,不含元素的空表成爲空棧,棧的修改原則是後進先出。bash
操做相對簡單,因爲在初始化時限定了存儲空間,因此空間侷限性大。markdown
#define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 /* 存儲空間初始分配量 */ typedef int Status; typedef int SElemType; /* SElemType類型根據實際狀況而定,這裏假設爲int */ /* 順序棧結構 */ typedef struct { SElemType data[MAXSIZE]; int top; /* 用於棧頂指針 */ }SqStack; 複製代碼
//1構建一個空棧 Status InitStack(SqStack *S){ S->top = -1; return OK; } //2 將棧置空 Status ClearStack(SqStack *S){ S->top = -1; return OK; } //3 判斷順序棧是否爲空; Status StackEmpty(SqStack S){ if (S.top == -1){ return TRUE; }else{ return FALSE; } } //4 返回棧的長度 int StackLength(SqStack S){ return S.top + 1; } //5 獲取棧頂 Status GetTop(SqStack S,SElemType *e){ if (S.top == -1){ return ERROR; }else{ *e = S.data[S.top]; } return OK; } //6 插入元素e爲新棧頂元素 Status PushData(SqStack *S, SElemType e){ if (S->top == MAXSIZE -1) { return ERROR; } S->top ++; S->data[S->top] = e; return OK; } //7 刪除S棧頂元素,而且用e帶回 Status Pop(SqStack *S,SElemType *e){ if (S->top == -1) { return ERROR; } *e = S->data[S->top]; S->top--; return OK; } int main(int argc, const char * argv[]) { SqStack S; int e; if (InitStack(&S) == OK) { for (int j = 1 ; j < 10; j++) { PushData(&S, j); } } printf("順序棧中元素爲:\n"); StackTraverse(S); Pop(&S, &e); printf("彈出棧頂元素爲: %d\n",e); StackTraverse(S); printf("是否爲空棧:%d\n",StackEmpty(S)); GetTop(S, &e); printf("棧頂元素:%d \n棧長度:%d\n",e,StackLength(S)); ClearStack(&S); printf("是否已經清空棧 %d, 棧長度爲:%d\n",StackEmpty(S),StackLength(S)); return 0; } 複製代碼
空間大小不固定,可擴展性強spa
#define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 /* 存儲空間初始分配量 */ typedef int Status; typedef int SElemType; /* SElemType類型根據實際狀況而定,這裏假設爲int */ /* 鏈棧結構 */ typedef struct StackNode { SElemType data; struct StackNode *next; }StackNode,*LinkStackPtr; typedef struct { LinkStackPtr top; int count; }LinkStack; 複製代碼
/*1 構造一個空棧S */ Status InitStack(LinkStack *S) { S->top=NULL; S->count=0; return OK; } /*2 把鏈棧S置爲空棧*/ Status ClearStack(LinkStack *S){ LinkStackPtr p,q; p = S->top; while (p) { q = p; p = p->next; free(q); } S->count = 0; return OK; } /*3 判斷是否爲空棧*/ Status StackEmpty(LinkStack S){ if (S.count == 0) return TRUE; else return FALSE; } /*4 返回S的元素個數,即棧的長度*/ int StackLength(LinkStack S){ return S.count; } /*5 若鏈棧S不爲空,則用e返回棧頂元素,並返回OK ,不然返回ERROR*/ Status GetTop(LinkStack S,SElemType *e){ if(S.top == NULL) return ERROR; else *e = S.top->data; return OK; } /*6 插入元素e到鏈棧S (成爲棧頂新元素)*/ Status Push(LinkStack *S, SElemType e){ LinkStackPtr temp = (LinkStackPtr)malloc(sizeof(StackNode)); temp->data = e; temp->next = S->top; S->top = temp; S->count++; return OK; } /*7 若棧不爲空,則刪除S的棧頂元素,用e返回其值.並返回OK,不然返回ERROR*/ Status Pop(LinkStack *S,SElemType *e){ LinkStackPtr p; if (StackEmpty(*S)) { return ERROR; } *e = S->top->data; p = S->top; S->top= S->top->next; free(p); S->count--; return OK; } int main(int argc, const char * argv[]) { int j; LinkStack s; int e; if(InitStack(&s)==OK) for(j=1;j<=10;j++) Push(&s,j); printf("棧中元素依次爲:"); StackTraverse(s); Pop(&s,&e); printf("彈出的棧頂元素 e=%d\n",e); StackTraverse(s); printf("棧空否:%d(1:空 0:否)\n",StackEmpty(s)); GetTop(s,&e); printf("棧頂元素 e=%d 棧的長度爲%d\n",e,StackLength(s)); ClearStack(&s); printf("清空棧後,棧空否:%d(1:空 0:否)\n",StackEmpty(s)); return 0; } 複製代碼