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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【数据结构与算法】栈的介绍及基本运算(出栈、入栈、销毁栈等)

發布時間:2023/12/31 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构与算法】栈的介绍及基本运算(出栈、入栈、销毁栈等) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、棧的介紹
棧(Stack)是限定只能在表的一端進行插入刪除操作的線性表。
允許插入和刪除運算的一端稱作棧頂(top)。
不允許插入和刪除的另一端稱作棧底(bottom)。
在棧頂進行的插入操作稱為入棧或進棧(push)
在棧頂進行的刪除操作稱為出棧或退棧(pop)
棧的特點:后進先出,即 LIFO(Last In First Out)
如下圖:

順序棧的數據類型
靜態分配:

#define MaxSize 100 #define int ElemType typedef struct { ElemType data[MaxSize]; // 數組存儲空間int top; //棧頂下標 } SqStack; // 順序棧數據類型

MaxSize為順序棧的最大容量;
top為棧頂元素的下標,0 <= top <= MaxSize-1
棧空:top = -1;
棧滿:top = MaxSize-1


注意棧空和棧滿的判斷條件,如上圖,棧頂top = 0 時,有數據元素a1,所以top = -1時,才能判斷棧空。棧滿時,由上圖看知。

動態分配:

#define int ElemType typedef struct { ElemType *base; //棧底的指針ElemType *top; //棧頂的指針 } SqStack; // 順序棧數據類型

鏈式棧的數據型

typedef struct LNode {ElemType data; //數據域struct LNode *next; //后繼結點指針 } LinkStNode; //鏈棧結點類型

S:單鏈表頭指針,指向頭結點。
棧頂:單鏈表第一個元素結點的位置,即頭結點的后一個位置。

二、順序棧的基本運算
1、初始化棧
建立一個新的空棧s,實際上是將棧頂指示變量置-1即可。

//初始化空順序棧 int InitStack(SqStack &S) {S.top = -1;return 1; }

2、入棧
①判斷棧是否已滿,若滿則產生上溢出錯誤,退出算法,否則執行第②步;
②棧頂下標增一(top++),指向新的棧頂位置;
③將新元素置于棧頂。

//item是需要入棧的數據元素 bool Push(SqStack &S, ElemType item) {if (S.top == MaxSize - 1){cout << "棧滿" << endl;return false;}S.top++;S.data[S.top] = item;return true; }

3、出棧:
①判斷棧是否為空,若空則產生下溢出錯誤,退出算法,否則執行第②步;
②棧頂元素出棧;
③棧頂下標減一(top++),指向新的棧頂位置;

bool Pop(SqStack &S, ElemType &item) {if (S.top == -1){cout << "棧空" << endl;return false;}item = S.data[S.top];S.top--;return true; }

4、判斷棧是否為空
棧S為空的條件是s.top==-1。

//判棧空 int StackEmpty(SqStack &S) {if(S.top==-1)return 1;elsereturn 0; }

5、取棧頂元素
在棧不為空的條件下,將棧頂元素賦給e。

//取棧頂 int GetTop(SqStack &S, DataType &e) {if(S.top <= -1){cout<<"棧空"<<endl;return 0;}item=S.items[S.top];return 1; }

注意:
取棧頂元素和出棧不同,取棧頂元素只是把棧頂元素復制一份,棧頂指針并沒有改變。如下圖:

入棧時要判斷棧是否滿,出棧時要判斷是否為空。

三、鏈式棧的基本運算
1、初始化棧
建立一個空棧s。實際上是創建鏈棧的頭結點,并將其next域置為NULL。

void (SNode *&s) { s=(SNode *)malloc(sizeof(SNode));//s=new SNode;s->next=NULL; }

2、入棧:

bool Push(LinkStNode *S, ElemType item) { //帶頭結點單鏈表的表頭插入法LinkStNode *t = new LinkStNode; //①生成新結點if (t == NULL){cout << "內存不足";return false;}t->data = item;//②在棧頂插入新結點t->next = S->next;S->next = t; //③return true; }


3、出棧:

bool Pop(LinkStNode *S, ElemType &item) { //刪除單鏈表的第一個元素結點//①判斷棧是否為空if (S->next == NULL){cout << "棧空";return false;}//②刪除棧頂元素LinkStNode *t = S->next;S->next = t->next;item = t->data;delete t;return true; }


4、銷毀棧

//釋放鏈棧 void Destroy(SNode *&s) {SNode *p;while(s!=NULL){p=s;s=s->next;delete p;} }

5、判斷棧是否為空
棧S為空的條件是s->next==NULL,即單鏈表中沒有數據結點。

//判棧空 int StackEmpty(SNode *s) {if(s->next==NULL)return 1;elsereturn 0; }

6、取棧頂元素

int GetTop(SNode *s,DataType &e) { if (s->next==NULL) //棧空的情況{return 0;}e=s->next->data;return 1; }

總結

以上是生活随笔為你收集整理的【数据结构与算法】栈的介绍及基本运算(出栈、入栈、销毁栈等)的全部內容,希望文章能夠幫你解決所遇到的問題。

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