棧知足下列兩點:數組
1.棧只能從表的一端存取數據,另外一端是封閉的。
2.在棧中,不管是存數據仍是取數據,都必須遵循"先進後出"的原則,即最早進棧的元素最後出棧。
總結:棧是一種只能從表的一端存取數據且遵循 "先進後出" 原則的線性存儲結構。數據結構
如圖:棧存儲結構存儲 {1,2,3,4}
spa
棧的順序表實現:指針
#include <stdio.h> #define Size 100 typedef struct stacktag { int a[Size]; int top; }stack; #入棧 int rush(int* a,int top,int elem){ if(++top>=Size) { printf("棧已滿\n"); return --top; } a[++top]=elem; printf("插入元素:%d\n",a[top]); return top; }
#出棧 int pop(int * a,int top){ if (top==-1) { printf("空棧"); return -1; } printf("彈棧元素:%d\n",a[top]); top--; return top; } int main () { stack stack1; stack1.top = -1; printf("初始化成功\n"); stack1.top = rush(stack1.a,stack1.top,1); stack1.top = rush(stack1.a,stack1.top,5); stack1.top = pop(stack1.a,stack1.top); return 0; }
初始化成功 插入元素:1 插入元素:5 彈棧元素:5
隊列知足下列兩點:code
1.隊列從一端表存儲數據,從另外一端是讀取數據。
2.數據的入隊和出隊遵循"先進先出"的原則;blog
總結:隊列是一種從表的一端存儲數據,從另外一端讀取數據,知足「先進先出」的數據結構。隊列
隊列的實現:io
#include <stdio.h> #define max 5//表示順序表申請的空間大小 int enQueue(int *a,int front,int rear,int data){ //添加判斷語句,若是rear超過max,則直接將其從a[0]從新開始存儲,若是rear+1和front重合,則表示數組已滿 if ((rear+1)%max==front) { printf("空間已滿"); return rear; } a[rear%max]=data; rear++; return rear; } int deQueue(int *a,int front,int rear){ //若是front==rear,表示隊列爲空 if(front==rear%max) { printf("隊列爲空"); return front; } printf("%d ",a[front]); //front再也不直接 +1,而是+1後同max進行比較,若是=max,則直接跳轉到 a[0] front=(front+1)%max; return front; } int main() { int a[max]; int front,rear; //設置隊頭指針和隊尾指針,當隊列中沒有元素時,隊頭和隊尾指向同一塊地址 front=rear=0; //入隊 rear=enQueue(a,front,rear, 1); rear=enQueue(a,front,rear, 2); rear=enQueue(a,front,rear, 3); rear=enQueue(a,front,rear, 4); //出隊 front=deQueue(a, front, rear); //再入隊 rear=enQueue(a,front,rear, 5); //再出隊 front=deQueue(a, front, rear); //再入隊 rear=enQueue(a,front,rear, 6); //再出隊 front=deQueue(a, front, rear); front=deQueue(a, front, rear); front=deQueue(a, front, rear); front=deQueue(a, front, rear); return 0; }
1 2 3 4 5 6
使用環形表實現順序隊列的方法須要注意的是,順序隊列在判斷數組是否已滿時,出現下面狀況:class
順序隊列初始狀態沒有存儲任何元素,所以 top 指針和 rear 指針重合,且因爲順序隊列底層實現靠的是數組,所以 top 和 rear 其實是兩個變量,它的值分別是隊頭元素和隊尾元素所在數組位置的下標。變量
順序隊列的存儲狀態不一樣,可是判斷條件相同。爲了對其進行區分,最簡單的解決辦法是:犧牲掉數組中的一個存儲空間,判斷數組滿員的條件是:尾指針的下一個位置和頭指針相遇,就說明數組滿了,即程序中第 5 行所示。