數據結構 【棧與隊列】

 

 棧

棧知足下列兩點:數組

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 行所示。

相關文章
相關標籤/搜索