顺序栈的讲解
堆棧(簡稱棧)是插入和刪除操作都在表的同一端進(jìn)行的線性表。運行插入和刪除元素的一端稱為棧頂(top),另一端稱為棧底(bottom)。如果堆棧中沒有元素,則為空棧。棧是一個后進(jìn)后出的結(jié)構(gòu)(Last In First Out),簡稱為LIFO結(jié)構(gòu)。
有幾點需要注意:
1.棧本質(zhì)上還是線性表,只是這個線性表增加了新的限定規(guī)則,只能在一端進(jìn)行插入和刪除。
2.棧和線性表一樣,也有順序存儲(順序棧)和鏈?zhǔn)酱鎯?#xff08;鏈?zhǔn)綏?#xff09;兩種結(jié)構(gòu)。
3.棧的插入叫進(jìn)棧,棧的刪除叫出棧
目錄
- 順序棧
- 初始化
- 出棧
- 入棧
- 判斷棧空
- 判斷棧滿
- 取棧頂元素
- 取有效元素個數(shù)
- 遍歷
順序棧
順序棧是棧的順序?qū)崿F(xiàn)。順序棧是指利用順序存儲結(jié)構(gòu)實現(xiàn)的棧。采用地址連續(xù)的存儲空間(數(shù)組)依次存儲棧中數(shù)據(jù)元素。下面是順序棧的示意圖:
順序棧有八個操作,分別是初始化,出棧,入棧,是否為空,是否為滿,取棧頂元素,取有效元素個數(shù),遍歷。
先對堆棧結(jié)構(gòu)體定義:
typedef struct//堆棧結(jié)構(gòu)體定義 {int top;//棧頂指針int data[MaxSize];//靜態(tài)數(shù)組存放棧中元素 }SqStack;初始化
根據(jù)上面的示意圖,初始化只需把棧頂指針指向-1就可以了。
void InitStack(SqStack &S)//初始化棧 {S.top = -1;//初始化棧頂指針 }出棧
1.判斷是否為空棧,空棧無法進(jìn)行出棧操作。
2.先賦值給x再移動棧頂指針,并且是向下移動。
入棧
1.判斷是否為棧滿,棧滿無法進(jìn)行入棧操作。
2.棧頂指針先向上移動,再把輸入的數(shù)據(jù)放進(jìn)去。
判斷棧空
只需要判斷棧頂指針指向的是不是-1,因為一開始空棧的時候棧頂指針指向的是-1。
int testStack(SqStack &S)//判斷棧空 {return (S.top == -1);//空棧返回1,反之返回0。 }判斷棧滿
由于棧頂指針指向的是-1,所以一開始放入的位置是0,棧滿的時候就會是MaxSize-1,只需判斷棧頂指針指向的是不是MaxSize-1就好了。
int IsFull(SqStack &S)//判斷棧滿 {return (S.top == MaxSize-1);//滿棧返回1,反之返回0。 }取棧頂元素
取棧頂元素的操作和一次出棧類似,但是不需要進(jìn)行棧頂指針的移動。
bool GetTop(SqStack &S)//讀取棧頂元素,操作和出棧類似,top不需要減1。 {if (S.top == -1)//判斷空棧return false;int x = S.data[S.top];printf("棧頂元素是:%d\n", x);return true; }取有效元素個數(shù)
由上面的效果圖可知,棧頂指針+1就可以了。
int lenth(SqStack &S)//求有效元素的個數(shù) {return S.top + 1; }遍歷
遍歷是進(jìn)行多次的出棧操作,并把每次出棧的數(shù)據(jù)打印出來。給出棧操作加上循環(huán)和輸出即可。
全部代碼:
#define _CRT_SECURE_NO_WARNINGS #define MaxSize 5 #include<stdio.h>typedef struct//堆棧結(jié)構(gòu)體定義 {int top;//棧頂指針int data[MaxSize];//靜態(tài)數(shù)組存放棧中元素 }SqStack;void InitStack(SqStack &S)//初始化棧 {S.top = -1;//初始化棧頂指針 }int testStack(SqStack &S)//判斷棧空 {//只需要判斷棧頂指針指向的是不是-1,因為一開始空棧的時候棧頂指針指向的是-1。return (S.top == -1);//空棧返回1,反之返回0。 }int IsFull(SqStack &S)//判斷棧滿 {return (S.top == MaxSize-1);//滿棧返回1,反之返回0。 }bool Push(SqStack &S)//入棧(在棧頂位置插入元素) {printf("請輸入%d個數(shù):", MaxSize);for (int i = 0; i < MaxSize; i++){if (S.top == MaxSize - 1)//判斷棧滿了沒有return false;S.top = S.top + 1;//棧頂指針往上一位scanf("%d", &S.data[S.top]);//把這次輸入的元素放入此時棧頂指針指向的位置}return true; }bool GetTop(SqStack &S)//讀取棧頂元素,操作和出棧類似,top不需要減1。 {if (S.top == -1)return false;int x = S.data[S.top];printf("棧頂元素是:%d\n", x);return true; }int lenth(SqStack &S)//求有效元素的個數(shù) {return S.top + 1; }bool Printf(SqStack &S,int &x)//出棧(刪除棧頂元素) {if (S.top == -1)//判斷是否為空棧return false;x = S.data[S.top];//讓x等于此時棧頂指針?biāo)傅脑?/span>S.top = S.top - 1;//棧頂指針往下移動一位return true; }void DestroyStack(SqStack &S)//銷毀棧 {char a;getchar();printf("是否銷毀順序棧(Y/N):");scanf("%c", &a);if (a == 'Y'){printf("銷毀成功\n");S.top = -1;}elseprintf("未銷毀\n"); }int main() {int x;SqStack S;//聲明棧InitStack(S);//初始化棧Push(S);//入棧int a=testStack(S);//判斷棧空a == 1 ? printf("棧空\n") : printf("棧不是空的\n");a = IsFull(S);a == 1 ? printf("棧滿\n") : printf("棧不滿\n");GetTop(S);//讀取棧頂元素int len = lenth(S);printf("棧內(nèi)元素個數(shù):%d\n", len);Printf(S,x);//出棧DestroyStack(S);//銷毀棧return 0; }輸出結(jié)果:
如果有什么不懂的,文中有錯誤的可以私信聯(lián)系我,非常感謝。
覺得這篇博客對你有幫助的話可以點個贊呀。
總結(jié)
- 上一篇: MySQL性能管理及架构设计(一):什么
- 下一篇: 如何在latex中引用文献