数据结构——顺序栈和链式栈的简单实现和解析(C语言版)
生活随笔
收集整理的這篇文章主要介紹了
数据结构——顺序栈和链式栈的简单实现和解析(C语言版)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
摘自:數據結構學習——順序棧和鏈式棧的簡單實現和解析(C語言版)
作者:正弦定理
發布時間:2020-11-26 21:26:49
網址:https://blog.csdn.net/chinesekobe/article/details/110205257
數據結構——棧的簡單解析和實現
- 一、概念
- 二、入棧(push)
- 三、出棧(pop)
- 四、順序棧簡單實現
- (1)進棧操作
- (2)出棧操作
一、概念
本篇所講解的棧和隊列屬于邏輯結構上的劃分。邏輯結構分為線性結構、非線性結構
- 線性結構:有且僅有一個開始節點和一個終端節點,每個節點最多只有一個直接前驅和一個直接后繼。代表結構:棧、隊列
- 非線性結構:一個節點可能有多個直接前驅和多個直接后繼。代表結構:樹、圖
堆棧(英語:stack)又稱為?;蚨询B,是計算機科學中的一種抽象數據類型,只允許在有序的線性數據集合的一端(稱為堆棧頂端,英語:top)進行加入數據(英語:push)和移除數據(英語:pop)的運算。因而按照后進先出(LIFO, Last In First Out)的原理運作。
- 棧的主要特點就是LIFO(Last In First Out,后進先出),并且程序只能操作棧的一端,被操作的一端叫做棧頂(Top)。所以棧的使用非常簡單,但是實現的功能卻非常強大
- 棧的主要操作有兩個:入棧(push)、出棧(pop)
二、入棧(push)
- 如圖所示,棧就像一個瓶子,只有一個口。三個元素A、B、C先后入棧,先入棧的放在底部,后入棧的放在上面
三、出棧(pop)
- 根據圖示,棧頂的元素最先出棧。這與入棧的順序剛好相反,入棧順序是A->B->C,出棧順序是C->B->A。也就是說:棧是LIFO(Last In First Out,后進先出的)
- 看似簡單的棧,應用十分廣泛。操作系統的函數調用、各類編輯器的撤銷操作的實現都離不開棧。
棧有兩種實現方式:順序棧、鏈式棧
四、順序棧簡單實現
用數組實現棧,就是將數組的增、刪操作限制在頭部或者尾部,即只能在數組的一端操作元素,就成了順序棧
前提準備:
typedef char ElementType; // 進棧數據為字符型 typedef struct SNode {ElementType Data[MAXSIZE]; // 存放數據int Top; // 當前棧存放的數組的最大下標}SNode;typedef struct SNode* Stack;- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
(1)進棧操作
void Push(Stack PtrS, ElementType item) { // 進棧 // 滿的堆棧 Top == MAXSIZE - 1// 判斷棧是否滿if (PtrS->Top == MAXSIZE - 1) {printf("堆棧滿\n");// return Ptrs;}else {PtrS->Data[++(PtrS->Top)] = item;// return;} }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
(2)出棧操作
ElementType Pop(Stack PtrS) { // 出棧 // 空的的堆棧 Top == -1// 出棧需要判斷 堆棧是否為空if (PtrS->Top == - 1) {printf("堆??誠n");return -1;// ERROR 是 ElementType 的特殊值,標志錯誤}else {return PtrS->Data[(PtrS->Top)--];} }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
完整代碼:
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> #include<stdlib.h>#define MAXSIZE 10 // 設定棧的大小,以10個為例 #define ERROR NULL; //typedef int ElementType; typedef char ElementType; // 進棧數據為字符型 typedef struct SNode {ElementType Data[MAXSIZE]; // 存放數據int Top; // 當前棧存放的數組的最大下標}SNode;typedef struct SNode* Stack;void Push(Stack PtrS, ElementType item);// 壓棧 ElementType Pop(Stack PtrS);// 出棧void Init_Memu() // 功能菜單 {printf("******************************\n");printf("* 1.入棧 *\n");printf("* 2.出棧 *\n");printf("* 3.取棧頂元素 *\n");printf("* 4.判斷是否??? *\n");printf("* 5.退出系統 *\n");printf("******************************\n");} int Chose_GongNeng() // 選擇功能 {int i;printf("請選擇你要實現的功能 : \n"); scanf("%d",&i);return i;} int main() {struct SNode ptr; // 創建個結構體對象 int num;ptr.Top = -1; // 棧空的標記符 為 -1while(1){ Init_Memu();num = Chose_GongNeng();switch(num){case 1: // 入棧功能 { // int data;char data;ptr.Top = -1;while( ptr.Top != MAXSIZE-1 ){ printf("請輸入數據 :\n");getchar();scanf("%c",&data);// printf("count = %d\n",count);Push(&ptr,data);printf(" Top = %d\n",ptr.Top);} }break;case 2: // 出棧功能 { // int Pop_Data = 0;char Pop_Data = '0'; while(1){Pop_Data = Pop(&ptr);if(ptr.Top == -1){printf("出棧完畢,現在棧為空棧\n");break;}else{printf("出棧數據為 : %c \n",Pop_Data);}}}break;case 3: // 取棧頂元素 { if(ptr.Top == -1){printf("出棧完畢,沒有數據\n"); }else{printf("棧頂的數據為: %c \n",ptr.Data[ptr.Top]);}}break;case 4: // 判斷棧是否為空 {if(ptr.Top == -1){printf("此棧為空棧\n"); }else{printf("此棧已經插入數據\n");}}break;case 5: // 退出系統 printf("\n謝謝你的使用\n");exit(-1);default:printf("沒有這個功能,請重新選擇\n");break; }}return 0; }void Push(Stack PtrS, ElementType item) { // 進棧 // 滿的堆棧 Top == MAXSIZE - 1// 判斷棧是否滿if (PtrS->Top == MAXSIZE - 1) {printf("堆棧滿\n");// return Ptrs;}else {PtrS->Data[++(PtrS->Top)] = item; // 進棧數據,記錄并改變標記符Top// return;} }ElementType Pop(Stack PtrS) { // 出棧 // 空的的堆棧 Top == -1// 出棧需要判斷 堆棧是否為空if (PtrS->Top == - 1) {printf("堆??誠n");return -1;// ERROR 是 ElementType 的特殊值,標志錯誤}else {return PtrS->Data[(PtrS->Top)--]; // 出棧數據,記錄并改變標記符Top} }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
總結
以上是生活随笔為你收集整理的数据结构——顺序栈和链式栈的简单实现和解析(C语言版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 函数取整函数,MATLAB
- 下一篇: 数据结构——无向图创建邻接表以及深度遍历