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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据结构:顺序栈

發布時間:2025/3/12 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构:顺序栈 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

        • 棧:
        • 順序棧的實現及操作:
          • 1.定義一個棧
          • 2.構造一個空棧
          • 3.取棧頂元素
          • 4.插入元素e
          • 5.刪除棧頂元素,返回其值
          • 6.清空棧,銷毀棧
        • 棧的操作實例及代碼:

棧:

從數據結構上來看,棧也是線性表,但是是操作受限的線性表。

棧是限定僅在表尾進行插入或刪除操作的線性表。

對棧來說,表尾端稱為棧頂,表頭端稱為棧底。

棧是后進先出的線性表。

棧的基本操作:在棧頂插入刪除,初始化,判空,取棧頂元素等

棧也有兩種存儲方法,一種是順序棧,用一組地址連續的存儲單元依次存放自棧底到棧頂的數據元素。另一種是鏈棧。這里先整理順序棧。

順序棧的實現及操作:

1.定義一個棧

順序棧的定義完全可以用順序表的定義,不過這里由于經常要用到棧頂,所以就增加一個top指針,指向棧頂元素的下一個位置。由于當前已存的元素個數length可以由棧頂指針減棧底指針求出,所以,這里就省去length,只保留一個初始化定義時給定的最大存儲元素個數stacksize,當使用棧時空間不夠,可以再進行擴大。

top指針方便之處,就在于,插入的時候插到top指向的位置上,然后top指針自增。出棧的時候把top指針自減,然后把top指針指向位置的元素取出即可。

#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct {SElemType_Sq *base; SElemType_Sq *top; int stacksize; }SqStack;
2.構造一個空棧

base稱為棧底指針,top稱為棧頂指針。構造空棧,top指針和base指針指向同一位置,此時棧里面沒有元素(length=0)。其他的和構造一個空順序表一樣。

Status InitStack_Sq(SqStack &S) {S.base = (SElemType_Sq *)malloc(STACK_INIT_SIZE*sizeof(SElemType_Sq));if(!S.base)exit(OVERFLOW);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK; }
3.取棧頂元素

這里取棧頂元素,我們先判斷棧是否為空,如果不為空,取棧頂元素。棧頂元素再top指針的上一個位置,也就是S.top - 1(這里可以類比數組,a+1也就是指向a[1]的指針),那么取出的話把地址的值給e即可。注意這里僅僅是取出,不能改變棧頂指針,不能S.top–。

Status GetTop_Sq(SqStack S, SElemType_Sq &e) {if(S.top==S.base)return ERROR;e = *(S.top - 1); return OK; }
4.插入元素e

之前說了,S.top-S.base就是length當前已存的元素個數,那么如果length=最大存儲元素個數stacksize,那么再插入元素的時候就空間不夠了,所以這里需要再增加一段新的空間,能夠再多存STACKINCREMENT個元素。弄完之后我們的top指針應該指向棧頂元素的下一個位置,此時已經有stacksize個元素了,也就是說,top指針指向S.base + S.stacksize這個位置。(不理解可以類比數組a+stacksize就是&a[stacksize],而a時下標為0開始存元素的,也就是說現在a+stacksize指向的時第stacksize+1個元素的位置)

然后修改完top指針后,stacksize也更新為S.stacksize + STACKINCREMENT。

此時我們先把e賦值到top指針指向的位置,然后top指針指向棧頂元素的下一個位置,自己加一即可。

Status Push_Sq(SqStack &S, SElemType_Sq e) {if(S.top-S.base>=S.stacksize) {S.base = (SElemType_Sq *)realloc(S.base, (S.stacksize+STACKINCREMENT)*sizeof(SElemType_Sq));if(!S.base)exit(OVERFLOW); S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top = e; S.top++;return OK; }
5.刪除棧頂元素,返回其值

出棧的時候把top指針自減,然后把top指針指向位置的元素取出即可。

Status Pop_Sq(SqStack &S, SElemType_Sq &e) {if(S.top==S.base)return ERROR;S.top--; e = *(S.top);return OK; }
6.清空棧,銷毀棧

清空棧,意味著top指針和base指針指向同一位置。

但是銷毀棧,top指針和base指針指向null而且stacksize等于0。

Status DestroyStack_Sq(SqStack &S) {S.base = NULL;S.top = NULL;S.stacksize = 0;return OK; } Status ClearStack_Sq(SqStack &S) {S.top = S.base;return OK; }

棧的操作實例及代碼:

代碼:

#include<cstdio> #include<cstdlib>#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define UNDERFLOW -3 #define TRUE 1 #define FALSE 0 typedef int Status; typedef int SElemType_Sq;typedef struct {SElemType_Sq *base; SElemType_Sq *top; int stacksize; }SqStack;Status InitStack_Sq(SqStack &S) {S.base = (SElemType_Sq *)malloc(STACK_INIT_SIZE*sizeof(SElemType_Sq));if(!S.base)exit(OVERFLOW);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK; } Status GetTop_Sq(SqStack S, SElemType_Sq &e) {if(S.top==S.base)return ERROR;e = *(S.top - 1); return OK;} Status Push_Sq(SqStack &S, SElemType_Sq e) {if(S.top-S.base>=S.stacksize) {S.base = (SElemType_Sq *)realloc(S.base, (S.stacksize+STACKINCREMENT)*sizeof(SElemType_Sq));if(!S.base)exit(OVERFLOW); S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top = e; S.top++;return OK; } Status Pop_Sq(SqStack &S, SElemType_Sq &e) {if(S.top==S.base)return ERROR;S.top--; e = *S.top;return OK; } void PrintElem(SElemType_Sq e) {printf("%d ", e); } Status StackTraverse_Sq(SqStack S, void(Visit)(SElemType_Sq)) { SElemType_Sq *p = S.base;while(p<S.top)Visit(*p++);printf("\n");return OK; } Status StackEmpty_Sq(SqStack S) {if(S.top==S.base)return TRUE;elsereturn FALSE; } int main(){SqStack S;int i;SElemType_Sq e;printf("初始化順序棧 S ...\n"); InitStack_Sq(S);printf("\n");StackEmpty_Sq(S) ? printf(" S 為空!!\n") : printf(" S 不為空!\n");printf("\n");for(i=1; i<=6; i++) {printf("將 \"%2d\" 壓入棧 S \n", 2*i); Push_Sq(S, 2*i);}printf("\n");printf(" S 中的元素為:S = "); StackTraverse_Sq(S, PrintElem);printf("\n");Pop_Sq(S, e);printf("棧頂元素 \"%d\" 出棧...\n", e);printf(" S 中的元素為:S = "); StackTraverse_Sq(S, PrintElem);printf("\n");GetTop_Sq(S, e);printf("棧頂元素的值為 \"%d\" \n", e);printf("\n");}

運行結果:

初始化順序棧 S …

S 為空!!

將 " 2" 壓入棧 S
將 " 4" 壓入棧 S
將 " 6" 壓入棧 S
將 " 8" 壓入棧 S
將 “10” 壓入棧 S
將 “12” 壓入棧 S

S 中的元素為:S = 2 4 6 8 10 12

棧頂元素 “12” 出棧…
S 中的元素為:S = 2 4 6 8 10

棧頂元素的值為 “10”

總結

以上是生活随笔為你收集整理的数据结构:顺序栈的全部內容,希望文章能夠幫你解決所遇到的問題。

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