栈的顺序存储及实现(一)
繼續學習數據結構,今天我們來學習棧的相關知識。其實學習沒有捷徑,如果抱著一種吃快餐的態度進行學習,那是學不到東西,各種技術都是淺嘗輒止,那注定學習是不會有太大的效果。不知道你們討不討厭 某某語言從入門到精通的這類書籍?我在想,有這么牛逼么,一本書直接都從入門到精通了,只不是吸引那些初學者的鰲頭吧了。算法都是老前輩們留下來解決某一類問題非常行之有效的方法,不管什么時候都不會過時。雖然很多算法,在很多書上或者網上都有,但是我們得自己去敲一遍,才能有所收獲。
不扯了,首先我們來看一下棧的相關定義。
棧(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; }
棧的相關算法,還是比較容易理解的。
驗證結果截圖:
總結
以上是生活随笔為你收集整理的栈的顺序存储及实现(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编语言:实验7寻址方式在结构化数据访问
- 下一篇: android 瀑布流效果 保存地址