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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

栈的顺序存储及实现(一)

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

繼續學習數據結構,今天我們來學習棧的相關知識。其實學習沒有捷徑,如果抱著一種吃快餐的態度進行學習,那是學不到東西,各種技術都是淺嘗輒止,那注定學習是不會有太大的效果。不知道你們討不討厭 某某語言從入門到精通的這類書籍?我在想,有這么牛逼么,一本書直接都從入門到精通了,只不是吸引那些初學者的鰲頭吧了。算法都是老前輩們留下來解決某一類問題非常行之有效的方法,不管什么時候都不會過時。雖然很多算法,在很多書上或者網上都有,但是我們得自己去敲一遍,才能有所收獲。

不扯了,首先我們來看一下棧的相關定義。

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

我們把允許插入和刪除的一端稱為棧頂(top),另一端稱為棧底(bottom),不含任何數據元素的棧稱為空棧。棧又被稱為后進先出(LastIn First Out)的線性表,簡稱LIOF結構。

首先它是一個線性表,也就是說,棧元素具有線性關系,即前驅后繼關系。只不過它是一種特殊的線性表而已。

它的特殊之出在于限制了這個線性表的插入和刪除位置,它始終只在棧頂進行。這使得:棧底是固定的,最先進棧的只能在棧底。

棧的插入叫 進棧也稱 壓棧、入棧。

棧的刪除叫出棧,也稱彈棧。

當然 壓棧和出棧是棧最重要的算法。

實際上棧在程序中用的是特別多的,比如瀏覽器的前進后退,文檔的撤銷操作等都是用的棧的方式。

接下來我們用數組也就是順序存儲結構來實現棧的相關算法。

下面是我們棧的數據結構

typedef struct SeqStack {
EleType data[MAXSIZE];//存儲棧數據
int top;//棧頂位置
}SeqStack;

進棧操作:

棧未滿的情況下,插入元素為新的棧頂,棧頂指針相應加1。


出棧操作:

若棧不為空,則刪除stack的棧頂元素,棧頂減一,返回刪除元素值。

當為棧空時 top=-1。

下面通過代碼來實現棧的相關算法實現。

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <math.h> #include <math.h> #include <stdlib.h> #define MAXSIZE 100 #define ERROR 0 #define OK 1 #define TRUE 1 #define FALSE 0 typedef int EleType; //順序存儲結構的棧的數據結構 typedef struct SeqStack {EleType data[MAXSIZE];//存儲棧數據int top;//棧頂位置 }SeqStack; /* 初始化鏈表,直接將棧頂置為-1,就代表,棧內所有位置可用。 */ int initStack(SeqStack* stack) {if (NULL == stack) {return ERROR;}stack->top = -1;return OK ; } /* 壓棧,很簡單,在空間允許情況下往棧頂上面一個位置進行壓入元素 */ int push(SeqStack * stack, EleType e) {if (NULL == stack || MAXSIZE == stack->top + 1) {return ERROR;}stack->data[stack->top + 1] = e;stack->top++;return OK; } /* 彈棧,一樣的道理,在非空棧中彈出元素,通過指針將元素值進行返回。 */ void pop(SeqStack* stack, EleType* e) {if (NULL == stack || NULL == e || stack->top == -1) {return ERROR;}*e = stack->data[stack->top];stack->top--;return OK; } /* 從棧頂向下展示元素值 */ void showStack(SeqStack* stack) {if (NULL == stack||stack->top==-1) {return;}int i = stack->top;for (; i >=0; i--){printf("%d\n", stack->data[i]);}return; } /* 清空棧 */ int clearStack(SeqStack* stack) {if (NULL == stack) {return ERROR;}stack->top = -1;return OK; } /* 判斷棧是否為空 */ int stackEmpty(SeqStack* stack) {if (NULL == stack) {return ERROR;}if (stack->top == -1) {return TRUE;}return FALSE; } int getTop(SeqStack* stack,EleType *e) {if (NULL == stack) {return ERROR;}*e = stack->data[stack->top];return OK; } /* 棧元素個數 */ int getStackLength(SeqStack* stack) {if (NULL == stack) {return ERROR;}return stack->top + 1; }int main(int argc, char *argv[]) {SeqStack stack;//創建順序棧initStack(&stack);//初始化push(&stack, 5);push(&stack, 4);push(&stack, 3);push(&stack, 2);push(&stack, 1);printf("壓入元素個數%d\n", getStackLength(&stack));puts("分別為:");showStack(&stack);puts("彈出2個元素后:");EleType e1,e2;pop(&stack, &e1);pop(&stack, &e2);showStack(&stack);printf("彈出元素為:%d,%d\n", e1, e2);return 0; }
棧的相關算法,還是比較容易理解的。

驗證結果截圖:




總結

以上是生活随笔為你收集整理的栈的顺序存储及实现(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

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