数据结构:顺序栈
文章目錄
- 棧:
- 順序棧的實現及操作:
- 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”
總結
- 上一篇: oracle 修改2个表,oracle学
- 下一篇: arduino光敏+LED+数码管+蜂鸣