栈的基本操作
對于棧這一數據結構,我首先寫一下它的基本概念。
一.基本概念:
棧(stack)是僅限定在表尾進行插入和刪除操作的線性表。
棧就是一個線性表,只不過,棧的Insert 和 delete只能在表尾。
普通的線性表,在表中的任意位置都可以進行insert和delete操作。
LIFO: Last In First Out 后進先出,先進后出。
棧頂(Top): 進行插入和刪除操作的一端。
棧底(Bottom)
棧其實我們計算機科學中,更多的一種思想,“先進后出的思想”。在很多算法或應用中,需要用到“先進后出的思想”,我們可以考慮用棧來實現。
二.存儲結構:
順序結構: 用一組地址連續的空間來存儲數據元素。
鏈式結構: ?用地址不連續的空間來存儲數據元素,可能需要額外開辟一些空間,來存儲“數據元素之間的邏輯關系"。
三.棧的基本操作:
(1)初始化一個棧:InitStack
(2)銷毀一個棧:DestroyStack
(3)清空一個棧:ClearStack
(4)判斷一個棧是否為空:StackIsEmpty
(5)返回棧中元素個數,即棧的長度:StackLength
(6)入棧,把一個元素加入到棧中:Push?
(7)出棧,把棧頂元素給干掉:Pop?
(8)返回棧頂元素,但不出棧:GetTop
接下來我們用代碼來試下這些效果
#include <stdio.h> #include <stdlib.h> //順序棧typedef int SElemType;//順序棧的數據類型 結構體 typedef struct SeqStack {//SElemType data[1024]SElemType *data;// data用來存儲棧中的元素//data = malloc(); 動態數組int maxlen;//棧中最多有多少個元素。int top;//棧頂元素的下標 -1 代表是一個空棧 }SeqStack;//初始化一個棧 // @maxl: 代表 制定這個棧的最大可以存儲多少個元素 //返回值 : 返回初始化好的順序棧指針 SeqStack * InitStack(int maxl) {SeqStack *s = malloc(sizeof(*s));s->data = malloc(sizeof(SElemType)* maxl);s->top = -1;s->maxlen = maxl;return s; } //銷毀一個棧 void DestoryStack(SeqStack*s) {if(s==NULL)return ;free(s->data);free(s); } //清空一個棧 void ClearStack(SeqStack*s) {if(s==NULL)return ;s->top=-1; } //判斷一個棧是否為空 // 1 表示為空?;虿淮嬖?// 0 表示非空棧 int StackisEmpty(SeqStack*s) {if(s==NULL ||s->top ==-1 ){return 1;}return 0; } //返回棧中的元素個數咯 int Stacklength(SeqStack *s) {if(s==NULL){return 0;}return s->top +1; } //入棧操作 //@s : 棧指針,表示那個棧 //@x: 要入棧的元素 //返回值 表示入棧是否成功 // 1 表成功 0 表失敗 int Push(SeqStack *s ,SElemType x) {//最大元素個數為1 s->top=0 if(s==NULL ||s->top == s->maxlen -1){return 0;}s->data[++s->top]=x;if(s->top==s->maxlen -1)return 0;elsereturn 1; } /**/ int Pop(SeqStack *s,SElemType *e) {if(s==NULL || s->top == -1){return 0;}*e = s->data[s->top--];//3if(s->top == -1)return 0;elsereturn 1; } //獲取棧頂元素的但是不出棧 int GetTop(SeqStack *s,SElemType *e) {if(s==NULL || s->top == -1){return 0;}*e = s->data[s->top];return 1; } int main() {int n,m=1;int x;scanf("%d",&n);SeqStack *s= InitStack(n);while(m){scanf("%d",&x);m=Push(s,x);}m=1;while(m){int a=0;m=Pop(s,&a);printf("%d ",a);}printf("\n");ClearStack(s);m=StackisEmpty(s);if(m==1)printf("棧已清空!\n");return 0; }?效果如下:
第一個數字為輸入個數,第二行為輸入數字的順序,第三行是存儲的數字出棧的順序,剛好符合棧的規律。
其中相應的代碼如下:
棧的定義:
typedef struct SeqStack {//SElemType data[1024]SElemType *data;// data用來存儲棧中的元素//data = malloc(); 動態數組int maxlen;//棧中最多有多少個元素。int top;//棧頂元素的下標 -1 代表是一個空棧 }SeqStack; SeqStack * InitStack(int maxl) {SeqStack *s = malloc(sizeof(*s));s->data = malloc(sizeof(SElemType)* maxl);s->top = -1;s->maxlen = maxl;return s; }棧的銷毀:
void DestoryStack(SeqStack*s) {if(s==NULL)return ;free(s->data);free(s); }棧的清空:
void ClearStack(SeqStack*s) {if(s==NULL)return ;s->top=-1; }棧是否為空的判斷:
int StackisEmpty(SeqStack*s) {if(s==NULL ||s->top ==-1 ){return 1;}return 0; }棧的元素個數:
int Stacklength(SeqStack *s) {if(s==NULL){return 0;}return s->top +1; }入棧操作:
int Push(SeqStack *s ,SElemType x) {//最大元素個數為1 s->top=0 if(s==NULL ||s->top == s->maxlen -1){return 0;}s->data[++s->top]=x;if(s->top==s->maxlen -1)return 0;elsereturn 1; }出棧操作:
int Pop(SeqStack *s,SElemType *e) {if(s==NULL || s->top == -1){return 0;}*e = s->data[s->top--];//3if(s->top == -1)return 0;elsereturn 1; }棧頭元素的判斷:
int GetTop(SeqStack *s,SElemType *e) {if(s==NULL || s->top == -1){return 0;}*e = s->data[s->top];return 1; }其中對于子函數的調用,在主函數中已寫清楚。這里就不再贅述。其實對于棧的理解,可以用數組的思想來理解。上述皆是順序結果的棧,對于鏈式棧,這里也不再說了。最后,望各位老鐵多多支持。
總結
- 上一篇: 如何退出控屏软件(以极域为例)
- 下一篇: 标准RTSP 消息的错误代码