棧是一種常見的數據結構,它雖然有棧頂和棧底之分,但它只能從一端操作(插入或刪除),從而是一種“先進後出”的操作模式。向棧內進數據稱爲壓棧(Push),從棧裏取出數據叫出棧(POp)。例如壓棧順序爲1、2、3、4、5,着出棧的順序爲5、4、3、2、1(只考慮一次性出棧的情況)。
棧按照存儲的方式,又分爲順序棧和鏈表棧。順序棧基於數組實現,所以順序棧存儲數據的內存是連續的,在創建棧時規定好棧的大小,這樣對內存的使用效率並不高。而鏈式棧則是採用了鏈表來實現,其元素的存儲地址是不連續的,而且是動態分配內存。順序棧在使用的過程中可能出現 棧滿、棧空的情況,由於鏈式棧基於鏈表設計,因此不會有棧滿的情況(也會棧空)。
順序棧:
//順序棧 #include <stdio.h> #define SIZE 10 typedef struct Stack { int data[SIZE]; int top; }Stack; //初始化棧 void init_stack(Stack* st) { st->top=-1; } //判斷棧是否爲空 int is_stack_empty(Stack* st) { if(st->top==-1) return 1; return 0; } //判斷棧是否爲滿 int is_stack_full(Stack* st) { if(st->top==SIZE-1) { return 1; } return 0; } //獲取棧頂值 int get_top_value(Stack* st) { if(is_stack_empty(st)) { printf("stack is empty!\n"); return -1; } return st->data[st->top]; } //進棧 void push(Stack* st,int _data) { if(is_stack_full(st)) { printf("stack is full!\n"); return ; } st->top++; st->data[st->top]=_data; } //出棧 int pop(Stack* st) { if(is_stack_empty(st)) { printf("stack is empty!\n"); return -1; } return st->data[st->top--]; } int main(int argc, char const *argv[]) { Stack st; init_stack(&st); int i; for(i=0;i<10;i++) { push(&st,i); } push(&st,23); push(&st,23); printf("topvalue:%d\n",get_top_value(&st)); for(i=0;i<12;i++) { printf("%d\n",pop(&st)); } return 0; }
鏈式棧:
#include <stdio.h> #include <stdlib.h> //定義節點 typedef struct Node { int data; struct Node* next; }Node; typedef struct Stack { Node* top; }Stack; //初始化棧 void init_stack(Stack* st) { st->top=NULL; } //判斷棧是否爲空 int is_stack_empty(Stack* st) { if(st->top==NULL) { return 1; } return 0; } //獲取棧頂值 int get_topvalue(Stack* st) { if(is_stack_empty(st)) { printf("Stack is empty!\n"); return -1; } return st->top->data; } //進棧 void push(Stack* st,int _data) { Node* newnode=(Node*)malloc(1*sizeof(Node)); newnode->data=_data; newnode->next=st->top; st->top=newnode; } //出棧 int pop(Stack* st) { if(is_stack_empty(st)) { printf("Stack is empty!\n"); return ; } Node* temp=st->top; int retvalue=st->top->data; st->top=st->top->next; free(temp); return retvalue; } int main(int argc, char const *argv[]) { Stack st; init_stack(&st); int i; for(i=0;i<16;i++) { push(&st,i+1); } printf("%d\n",get_topvalue(&st)); for(i=0;i<17;i++) { printf("%d\t",pop(&st)); } printf("\n"); return 0; }