文章目錄
- 前言
- 1.棧的概念及結構
- 2.棧的實現
- 3.具體操作
- 3.1.初始化棧(StackInit)和銷毀棧(StackDestory)
- 3.2.入棧(StackPush)和出棧(StackPop)
- 3.3.獲得棧的個數(StackSize)、獲得棧頂元素(StackTop)以及判空(StackEmpty)
前言
前段時間我們學習過了鏈表和順序表等相關操作,今天學習一個比較特殊的數據結構—棧(Stack)
1.棧的概念及結構
棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂,另一端稱為棧底。棧中的數據元素遵守后進先出LIFO(Last In First Out)的原則。
壓棧:棧的插入操作叫做進棧/壓棧/入棧,入數據在棧頂。
出棧:棧的刪除操作叫做出棧。出數據也在棧頂
2.棧的實現
棧的實現一般可以使用數組或者鏈表實現,相對而言數組的結構實現更優一些。因為數組在尾上插入數據的代價比較小。
既然是使用數組進行維護,那么棧的結構:
typedef int STDataType;
typedef struct Stack
{STDataType* arr;int top;//用于確定數組個數,又可以通過top下標獲得棧頂的元素int capacity;
}Stack;
還有一些操作
#include<assert.h>
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int STDataType;
typedef struct Stack
{STDataType* arr;int top;//用于確定數組個數,又可以通過top下標獲得棧頂的元素int capacity;
}Stack;
//初始化
void StackInit(Stack* ps);
//銷毀棧
void StackDestory(Stack* ps);
//入棧
void StackPush(Stack* ps, STDataType x);
//出棧
void StackPop(Stack* ps);
//獲得棧頂元素
STDataType StackTop(Stack* ps);
//獲得棧的個數
int StackSize(Stack* ps);
//判斷棧是否為空
bool StackEmpty(Stack* ps);
下面對這些方法進行演示
3.具體操作
3.1.初始化棧(StackInit)和銷毀棧(StackDestory)
//初始化
void StackInit(Stack* ps) {assert(ps);ps->arr = NULL;ps->capacity = ps->top = 0;
}
//銷毀棧
void StackDestory(Stack* ps) {assert(ps);free(ps->arr);ps->arr = NULL;ps->capacity = ps->top = 0;
}
3.2.入棧(StackPush)和出棧(StackPop)
//入棧
void StackPush(Stack* ps, STDataType x) {assert(ps);if (ps->capacity == ps->top) {int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity*sizeof(Stack));if (tmp == NULL) {perror("realloc fail");return;}ps->arr = tmp;ps->capacity = newCapacity;}ps->arr[ps->top] = x;ps->top++;
}
//出棧
void StackPop(Stack* ps) {assert(ps);assert(ps->size>0);ps->top--;
}
3.3.獲得棧的個數(StackSize)、獲得棧頂元素(StackTop)以及判空(StackEmpty)
//獲得棧頂元素
STDataType StackTop(Stack* ps) {assert(ps);assert(ps->arr);return ps->arr[ps->top-1];
}
//獲得棧的個數
int StackSize(Stack* ps) {assert(ps);return ps->top;
}
//判斷棧是否為空
bool StackEmpty(Stack* ps) {assert(ps);return ps->top == 0;
}
只能說跟順序表的流程一模一樣,只不過就是棧只能在棧頂放或者拿數據就行,完。