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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线性表------栈

發(fā)布時間:2023/12/1 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线性表------栈 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、基本概念

  • 棧:只允許在一端插入或刪除操作的線性表
  • 棧底(buttom):固定的,不允許進(jìn)行插入和刪除操作的另一端
  • 棧頂(top):線性表允許插入和刪除的一段
    棧是線性表,只不過受到限制了,只允許在棧頂進(jìn)行插入和刪除操作,所以先入棧的后出棧

2、順序棧

棧是線性表的特例,棧的順序存儲也是線性表順序存儲。棧的順序存儲結(jié)構(gòu)叫做順序棧,由于棧是受到限制的(只允許在棧頂進(jìn)行插入和刪除),所以順序棧需要在順序表是基礎(chǔ)上修改點(diǎn)

/*順序棧的定義 */ #define MaxSize 50 //定義棧中有多少個元素 typedef int ElemType; typedef struct {ElemType data[MaxSize];//存放棧中元素int top; //棧頂指針 }SqStack;

  • top值不能超過MaxSize
  • 空棧的判斷條件top==-1,初始值也是這個值,當(dāng)沒有元素時,top指向buttom后一個元素,滿棧的判斷條件top==MaxSize-1

2.1 基本操作

2.1.1 判空

/*判斷空 */ bool StackEmpty(SqStack S) {if (S.top == -1)return true;elsereturn false; }

2.1.2 進(jìn)棧
棧不滿時,棧頂指針先加1,再送值到棧頂元素

/*進(jìn)棧 */ bool Push(SqStack& S, ElemType x) {if (S.top == MaxSize - 1)return false;S.data[++S.top] = x;return true; }

2.1.3 出棧
先判斷棧是否為空,不為空,取棧頂元素,top減一

/*出棧 */ bool Pop(SqStack& S, ElemType& x) {if (S.top == -1)return false;x = S.data[S.top];S.top--;return true; }

2.1.4 讀取棧頂元素
棧頂不為空,取棧頂元素

/*讀取棧頂元素 */ bool GetTop(SqStack S, ElemType& x) {if (S.top == -1)return false;x = S.data[S.top];return true; }

3、共享?xiàng)?/h3>

棧底位置相對不變的,可以讓兩個順序棧共享一個一維數(shù)組,將兩個棧的棧底分別設(shè)置在共享?xiàng)5膬啥?#xff0c;兩個棧頂向共享空間的中間延伸,當(dāng)一個棧存放數(shù)據(jù)少,一個棧存放數(shù)據(jù)多,可以考慮共享?xiàng)?br />

typedef struct {ElemType data[MaxSize]; //存放元素int top1; //棧1棧頂int top2; //棧2棧頂 }SqDoubleStack;
  • 初始狀態(tài):top1=-1,top2=MaxSize,所以當(dāng)top1=-1時表示棧1空,top2=MaxSize時,表示棧2空
  • 棧滿:當(dāng)top1和top2相差1時,棧滿,此時兩個棧的棧頂緊挨著,沒有空間存放數(shù)據(jù)了
  • 出棧:top2加1,top1要減1
  • 入棧:top1加1,top2減1

3.1基本操作

3.1.1 進(jìn)棧

/*進(jìn)棧stackNum:棧的序號*/bool Push(SqDoubleStack& S, ElemType x, int stackNum) {if (S.top1 + 1 == S.top2)return false; //棧滿if (stackNum == 1)S.data[++S.top1] = x;if (stackNum == 2)S.data[++S.top2] = x;return true; }

4、鏈?zhǔn)綏?/h3>

采用鏈?zhǔn)酱鎯Φ臈7Q為鏈棧,鏈棧的優(yōu)點(diǎn)是便于多個棧共享存儲空間和提高其效率,并且不存在棧滿溢出的情況,通常采用單鏈表實(shí)現(xiàn),并規(guī)定所有操作都是在單鏈表的表頭進(jìn)行的
帶頭結(jié)點(diǎn):

typedef struct SNode {ElemType data; //數(shù)據(jù)域struct SNode* next; //指針域 } SNode,*SLink; //鏈棧的結(jié)點(diǎn) typedef struct LinkStack {SLink top; //棧頂指針int count; //鏈棧結(jié)點(diǎn)數(shù) }LinkStack; //鏈棧

不帶頭結(jié)點(diǎn):

typedef struct SNode {ElemType data; //數(shù)據(jù)域struct SNode* next; //指針域 } SNode,*SLink;

注意不帶頭結(jié)點(diǎn)和帶頭結(jié)點(diǎn)的鏈棧,在具體實(shí)現(xiàn)方面有所不同

  • 可以將頭指針當(dāng)做棧頂
  • 空棧的判斷條件定為top==null

4.1 基本操作

4.1.1 進(jìn)棧

/* 進(jìn)棧 */ bool Push(LinkStack *S, ElemType x) {SLink p = (SLink)malloc(sizeof(SNode));p->data = x;p->next = S->top;S->top = p;S->count++;return true;}

4.1.2 出棧

/*出棧 */ bool Pop(LinkStack* S, ElemType& x) {if (S->top == NULL)return false;x = S->top->data;SLink p = S->top;S->top = S->top->next;free(p);S->count--;return true; }

總結(jié)

以上是生活随笔為你收集整理的线性表------栈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。