线性表------栈
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,再送值到棧頂元素
2.1.3 出棧
先判斷棧是否為空,不為空,取棧頂元素,top減一
2.1.4 讀取棧頂元素
棧頂不為空,取棧頂元素
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):
不帶頭結(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “酌酒乱繁忧”下一句是什么
- 下一篇: 线性表-----队列