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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

栈的基本操作(C/C++)

發(fā)布時(shí)間:2023/12/9 c/c++ 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 栈的基本操作(C/C++) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 前言
  • 一、棧的定義
  • 二、順序棧
  • 三、兩棧共享空間
  • 四、鏈棧
  • 總結(jié)


前言


提示:以下是本篇文章正文內(nèi)容

一、棧的定義

棧(Stack)是受操作限制的線性表,插入和刪除數(shù)據(jù)元素的操作只能在線性表的一段進(jìn)行。

棧一般有棧底和棧頂,stack是限定僅在表尾進(jìn)行插入和刪除操作的線性表,允許插入和刪除的一端稱為棧頂,另一端稱為棧底

棧又稱為后進(jìn)先出的線性表,簡稱LIFO結(jié)構(gòu)
棧的插入操作,為壓棧、入棧;棧的刪除操作,為出棧

入棧(Push)
數(shù)據(jù)元素進(jìn)入棧內(nèi)

出棧(Pop)
棧內(nèi)元素從棧頂彈出

二、順序棧

順序棧:棧的順序存儲結(jié)構(gòu)
順序棧是用數(shù)組來實(shí)現(xiàn)的,并將下標(biāo)位0的作為棧底
附設(shè)指針top指示棧頂元素在數(shù)組中的位置

順序棧的結(jié)構(gòu)

typedef int SElemType;//SElemType類型根據(jù)實(shí)際情況來定 /* 順序棧結(jié)構(gòu) */ typedef struct {SElemType data[MAXSIZE];int top; //用于棧頂指針 }SqStack;

進(jìn)棧操作

/*進(jìn)棧操作 插入元素e為新的棧頂元素*/ Status Push(SqStack *S,SElemType e) {if(S->top == MAXSIZE -1) /*棧滿*/{return ERROR;}S->top++; /*棧頂指針增加一*/S->data[S->top] = e; /*將新插入元素賦值給棧頂空間*/return OK; }

出棧操作

/*出棧操作:若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK;否則返回ERROR*/ Status Pop(SqStack *S,SElemType *e) {if(S->top == -1)return ERROR;*e=S->data[S->top]; /*將要刪除的棧頂元素賦值給e*/S->top--; /*棧頂指針減一*/return OK; }

三、兩棧共享空間

對于相同數(shù)據(jù)類型的棧,可以用一個(gè)數(shù)組來存儲,讓一個(gè)棧的棧底為數(shù)組的始端,即下標(biāo)為0處,另一個(gè)棧的棧底為數(shù)組的末端,即下標(biāo)為數(shù)組長度n-1處。兩個(gè)棧如果增加元素,就是兩端點(diǎn)向中間延伸。

top1和top2分別為兩個(gè)棧的棧頂指針

top1+1=top2(棧滿);棧1為空棧,top1=-1;棧2為空棧,top2=n;
共享?xiàng)=Y(jié)構(gòu)

/*兩棧共享空間結(jié)構(gòu)*/ typedef struct {SElemType data[MAXSIZE];int top1; /*棧1棧頂指針*/int top2; /*棧2棧頂指針*/ }SqDoubleStack;

入棧操作
這里要判斷是棧1還是棧2的棧號參數(shù)stacklNumber

//插入元素e為新的棧頂元素 Status Push(SqDoubleStack *S,SElemType e, int stacklNumber) {if(S->top1+1==S->top2) /*棧滿*/return ERROR;if(stacklNumber==1) /*若棧1有元素進(jìn)棧*/S->data[++S->top1] = e; /*若棧1給top1+1后給數(shù)組元素賦值*/else if (stacklNumber ==2)/*若棧2有元素進(jìn)棧*/S->data[--S->top2]=e; /*若棧2給top2-1后給數(shù)組元素賦值*/return OK; }

出棧操作

/*若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK;否則返回ERROR*/ Status Pop(SqDoubleStack *S,SElemType *e, int stackNumber) {if (stackNumber == 1) {if (S->top1 == -1) /*空棧,溢出*/return ERROR;*e = S->data[S->top1--]; /*棧1的棧頂元素出棧*/}if (stackNumber == 2){if(S->top2==MAXSIZE) /*空棧,溢出*/return ERROR;*e = S->data[S->top2++]; /*棧2的棧頂元素出棧*/} }

四、鏈棧

鏈棧:棧的鏈接存儲結(jié)構(gòu)

將單鏈表的頭部作為棧頂,鏈棧不需要附設(shè)頭節(jié)點(diǎn)

鏈棧的結(jié)構(gòu)

//結(jié)點(diǎn) typedef struct StackNode {ElemType data;struct StackNode *next; }StackNode, *LinkStackPtr;typedef struct LinkStack {LinkStackPtr top; //棧頂指針int count }LinkStack;

進(jìn)棧操作

//進(jìn)棧操作:單鏈表有頭指針,而棧頂指針也是必須的,因此把棧頂放在單鏈表的頭部 //(頭結(jié)點(diǎn)->棧頂):相當(dāng)于頭插法;插入新元素e為新的棧頂元素 Status Push(LinkStack *S,SElemType e) {LinkStackPtr s=(LinkStackPtr) malloc(sizeof(StackNode)); /*聲明新結(jié)點(diǎn)*/s->data = e;s->next = S->top; /*把當(dāng)前的棧頂元素賦值給新結(jié)點(diǎn)的直接后繼*/S->top = s; /*將新的結(jié)點(diǎn)s賦值給棧頂指針*/S->count++;return OK; }

出棧操作

/*出棧操作:用p存儲被刪除的棧頂結(jié)點(diǎn),將棧頂指針下移一位,最后釋放p*/ #include <stdbool.h> bool StackEmpty(LinkStack S) {if(S.top ==NULL) /*如果是空棧,則top為*/return TRUE; } Status Pop(LinkStack *S,SElemType *e) {LinkStackPtr p;if (StackEmpty(*S))return ERROR;*e = S->top->data;p = S->top;S->top = S->top->next;free(p);S->count--;return OK; }


總結(jié)

提示:這里對文章進(jìn)行總結(jié):

如果棧的使用過程中元素變化不可預(yù)料,有時(shí)小,有時(shí)大,建議用鏈棧,反之,如果它的變化在可控范圍內(nèi),建議用順序棧。

總結(jié)

以上是生活随笔為你收集整理的栈的基本操作(C/C++)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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