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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

栈的基本操作

發布時間:2023/12/9 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 栈的基本操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對于棧這一數據結構,我首先寫一下它的基本概念。

一.基本概念:

棧(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; }

其中對于子函數的調用,在主函數中已寫清楚。這里就不再贅述。其實對于棧的理解,可以用數組的思想來理解。上述皆是順序結果的棧,對于鏈式棧,這里也不再說了。最后,望各位老鐵多多支持。

總結

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

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