用陣列和連結串列實現棧
阿新 • • 發佈:2019-01-06
完成一個棧總共需要完成以下操作:
初始化
入棧
出棧
檢視棧頂元素
檢視棧的容量
清空棧。
首先是簡單的,用陣列做的,會有越界的可能。
#include <stdio.h> #include <stdlib.h> typedef struct Stack { int data[100]; int top; } Stack; Stack * s ; // 生成棧 void initStack(){ s = (Stack *)malloc(sizeof(Stack)); s->top = -1; } // 入棧,push void push(int data){ if(s->top + 1 >= 100){ printf("超出了棧的最大容量,入棧失敗\n"); return; } s->top ++; s->data[s->top] = data; } // 出棧,pop void pop(){ if (s->top == -1){ printf("此棧已經是空棧了\n"); return; } printf("資料 %d 即將出棧\n",s->data[s->top]); s->top--; } // 清空棧 void clearStack(){ while (s->top >=0){ pop(); } } // 獲取棧頂元素 void topItem(){ if (s->top==-1){ printf("此棧為空棧\n"); return; } printf("此棧中元素數量為 %d 個,棧頂為 %d\n",s->top+1,s->data[s->top]); } int main() { initStack(); topItem(); push(3); push(7); push(1); push(8); push(13); topItem(); pop(); clearStack(); topItem(); }
用連結串列做的,理論上無上限,除非計算機記憶體都用完了。
#include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Stack * next; } Node; typedef struct Stack { Node * data; int count; } Stack; Stack * s ; // 生成棧 void initStack(){ s = (Stack *)malloc(sizeof(Stack)); s->count = 0; s->data = NULL; } // 入棧,push void push(int data){ Node * n = malloc(sizeof(Node)); n->data = data; n->next = s->data; s->data = n; s->count ++; } // 出棧,pop void pop(){ if(s->data == NULL) { printf("已經是空棧了"); return; } Node * n = s->data; printf("資料 %d 即將出棧\n",n->data); s->data=n->next; free(n); s->count--; } // 清空棧 void clearStack(){ while (s->data != NULL) { pop(); } } // 獲取棧頂元素 void topItem(){ if (s->data==NULL){ printf("此棧為空棧\n"); return; } printf("此棧中元素數量為 %d 個,棧頂為 %d\n",s->count,s->data->data); } int main() { initStack(); topItem(); push(3); push(7); push(1); push(8); push(13); topItem(); pop(); push(222); pop(); clearStack(); topItem(); }
計算機的函式呼叫就是採用了棧結構,還有逆波蘭表示式(可以算加減乘除和括號)的演算法都用到了棧結構。