日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

我爷爷都看的懂的《栈和队列》,学不会来打我

發布時間:2024/3/12 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我爷爷都看的懂的《栈和队列》,学不会来打我 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

棧和隊列

目錄

        • 順序棧
          • 順序棧定義
          • 順序棧初始化
          • 入棧
          • 出棧
          • 讀棧頂元素
          • 判斷棧是否為空
        • 共享棧
          • 定義
          • 初始化
          • 入棧
          • 出棧
        • 鏈棧
      • 隊列
        • 順序隊列
          • 定義
          • 初始化
          • 入隊
          • 出隊
          • 獲取隊頭元素
          • 判斷隊列是否為空
        • 隊列鏈式存儲
          • 定義
          • 初始化
          • 入隊
          • 出隊
          • 判斷隊列是否為空
        • 隊列鏈式存儲(不帶頭結點)
          • 定義
          • 初始化
          • 入隊
          • 出隊
          • 判斷隊列是否為空

  • 定義:是只允許在一端進行插入或刪除的線性表。首先棧是一種線性表,但限定這種線性表只能在某一端進行插入和刪除操作

順序棧

順序棧定義
  • 采用順序存儲的棧稱為順序棧,它利用一組地址連續的存儲單元存放自棧底到棧頂的數據元素,同時附設一個指針(top)指示當前棧頂元素的位置
#define MaxSize 10 typedef struct {int data[MaxSize];int top; }SqStack;
順序棧初始化
//初始化 void InitStack(SqStack& S) {S.top = -1; //data[0]還沒有放數據元素 }
入棧
//入棧 bool Push(SqStack& S, int x) {if (S.top == MaxSize - 1)return false;S.top = S.top + 1;//初始指向data[-1]S.data[S.top] = x;//等價于//S.data[++S.top] = x;return true; }
出棧
//出棧 bool Pop(SqStack& S, int& x) {if (S.top == -1)return false;x = S.data[S.top];S.top = S.top - 1;//等價于//x = S.data[S.top--];return true; }
讀棧頂元素
//讀棧頂元素 bool GetTop(SqStack S, int& x) {if (S.top == -1)return false;x = S.data[S.top];return true; }
判斷棧是否為空
//判斷棧是否為空 bool StackEmpty(SqStack S) {if (S.top == -1) //???/span>return true;elsereturn false; }

共享棧

定義
  • 利用棧底位置相對不變的特征,可讓兩個順序棧共享一個一維數組空間,將兩個棧的棧底分別設置在共享空間的兩端,兩個棧頂向共享空間的中間延伸
#define MaxSize 10typedef struct {int data[MaxSize];int top0;int top1; }ShStack;ShStack s; //全局變量
初始化
//初始化棧 void InitStack(ShStack& s) {s.top1 = MaxSize; //上s.top0 = -1;//下 }
入棧
//入棧 int push(int i, int x) {if (i < 0 || i>1) {cout << "棧號輸入不對" << endl;exit(0);}if (s.top1 - s.top0 == 1) {cout << "棧滿了" << endl;return 0;}switch (i){case 0:s.data[++s.top0] = x;break;case 1:s.data[--s.top1] = x;break;} }
出棧
//出棧 int pop(int i) {if (i < 0 || i>1) {cout << "棧號輸入錯誤" << endl;exit(0);}switch (i) {case 0:if (s.top0 == -1) {cout << "???#34; << endl;}else {//return s.data[s.top0--];cout << s.data[s.top0--] << endl;}break;case 1:if (s.top1 == MaxSize) {cout << "棧空" << endl;}else {//return s.data[s.top1++];cout << s.data[s.top1++] << endl;}break;} }

鏈棧

  • 采用鏈式存儲的棧稱為鏈棧,鏈棧的優點是便于多個棧共享存儲空間和提高其效率,且不存在棧滿上溢的情況。

類似單鏈表的頭插法

隊列

順序隊列

定義
  • 隊列的順序實現是指分配一塊連續的存儲單元存放隊列中的元素,并附設兩個指針:隊頭指針 front指向隊頭元素,隊尾指針 rear 指向隊尾元素的下一個位置
#define MaxSize 10 typedef struct {int data[MaxSize];int front, rear; //隊頭和隊尾指針 }SqQueue;
初始化
//初始化 void InitQueue(SqQueue& Q) {Q.rear = Q.front = 0; }
入隊
//入隊 bool EnQueue(SqQueue& Q, int x) {if ((Q.rear + 1) % MaxSize == Q.front) //犧牲一個節點空間return false;Q.data[Q.rear] = x;Q.rear = (Q.rear + 1) % MaxSize;return true; }
出隊
//出隊 bool DeQueue(SqQueue& Q, int& x) {if (Q.rear == Q.front) //判斷隊空return false;x = Q.data[Q.front];Q.front = (Q.front + 1) % MaxSize;return true; }
獲取隊頭元素
//獲取隊頭元素 bool GetHead(SqQueue Q, int& x) {if (Q.rear == Q.front)return false;x = Q.data[Q.front];return true; }
判斷隊列是否為空
//判斷隊列是否為空 bool QueueEmpty(SqQueue Q) {if (Q.rear == Q.front) //對空條件return true;elsereturn false; }

隊列鏈式存儲

定義
  • 隊列的鏈式存儲結構表示為鏈隊列,它實際上是一個同時帶有隊頭指針和隊尾指針的單鏈表,只不過它只能尾進頭出而已
typedef struct LinkNode {int data;struct LinkNode* next; }LinkNode;typedef struct {LinkNode* front, * rear; //隊頭和隊尾指針 }LinkQueue;
初始化
//初始化 void InitQueue(LinkQueue& Q) {Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));Q.front->next = NULL; }
入隊
//入隊 void EnQueue(LinkQueue& Q, int x) {LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));s->data = x;s->next = NULL;Q.rear->next = s;Q.rear = s; }
出隊
//出隊 bool DeQueue(LinkQueue& Q, int& x) {if (Q.front == Q.rear)return false; //空隊LinkNode* p = Q.front->next;x = p->data;Q.front->next = p->next;if (Q.rear == p)Q.rear = Q.front;free(p);return true; }
判斷隊列是否為空
//判斷隊列是否為空 bool IsEmpty(LinkQueue Q) {if (Q.front == Q.rear)return true;elsereturn false; }

隊列鏈式存儲(不帶頭結點)

定義
typedef struct LinkNode {int data;struct LinkNode* next; }LinkNode;typedef struct {LinkNode* front, * rear; //隊頭和隊尾指針 }LinkQueue;
初始化
//初始化 void InitQueue(LinkQueue& Q) {Q.front = NULL;Q.rear = NULL; }
入隊
//入隊(不帶頭結點) void EnQueue(LinkQueue& Q, int x) {LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));s->data = x;s->next = NULL;if (Q.front == NULL) {Q.front = s;Q.rear = s;} else {Q.rear->next = s;Q.rear = s;} }
出隊
//出隊(不帶頭結點) bool DeQueue(LinkQueue& Q, int& x) {if (Q.front == NULL)return false;LinkNode* p = Q.front;x = p->data;Q.front = p->next;if (Q.rear == p) { //此次是最后一個節點出隊Q.front = NULL;Q.rear = NULL;}free(p);return true; }
判斷隊列是否為空
//判斷隊列是否為空 bool IsEmpty(LinkQueue Q) {if (Q.rear == NULL)return true;elsereturn false; }

此博文的分享就到此啦,點個關注再走吧
?你好啊,我是“ 滿級小白”,是一名在校大學生。
🌍主頁鏈接:滿級小白的博客
??博文主更方向為:計算機408,數據庫,javaEE隨著專業的深入會越來越廣哦…一起期待。
??人生的每一次成長,都是從“覺得自己是個傻逼”開始的,人生每一次的陷入困境,都是從“覺得別人是個傻逼”開始的。
💪很高興與你相遇,一起加油!!!!

總結

以上是生活随笔為你收集整理的我爷爷都看的懂的《栈和队列》,学不会来打我的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。