棧:一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行數據插入刪除操作的一端稱爲棧頂,另一端稱爲棧底。不含任何元素的棧稱爲空棧
棧最大的特點就是:先進後出,後進先出
棧可分爲順序棧和鏈式棧
1)順序棧所有的操作時間複雜度都是O(1)
2)鏈式棧就不一定了得看你的棧頂位於鏈表的頭還是尾(一般建議將棧頂設計在鏈表頭的位置,這樣入棧出棧操作都是O(1)。否則入棧是O(1)出棧是O(N)。可以思考一下原因 --> 因爲你刪除掉鏈表的最後一個元素,可是他的前一個元素你得遍歷整個鏈表才能得知,進而才能重新確定棧頂位置)
在此我實現順序棧(操作相對都簡單些^0^)
#define MAX (100)
typedef char SDataType;
typedef struct stack
{
//定義一個數組存放數據
SDataType array[MAX];
//表示棧內有效元素的個數,也表示此時棧頂位置的下標
int top;
}stack;
我的棧中實現了以下的基本操作
//棧的初始化
void stackInit(stack *ps);
//入棧操作
void stackPush(stack *ps, SDataType data);
//出棧操作
void stackPop(stack *ps);
//求得棧頂元素
SDataType stackTop(stack *ps);
//判斷是否爲空棧
int stackIsEmpty(stack *ps);
//求得棧的大小(含數據的個數)
int stackSize(stack *ps);
//將棧進行拷貝
void stackCopy(stack *psDest, stack *psSrc);
1)初始化
void stackInit(stack *ps)
{
assert(ps != NULL);
ps->top = 0;
}
2)入棧
void stackPush(stack *ps, SDataType data)
{
assert(ps != NULL);
assert(ps->top < MAX);
ps->array[ps->top] = data;
ps->top++;
}
3)出棧
void stackPop(stack *ps)
{
assert(ps != NULL);
assert(ps->top > 0);
ps->top--;
}
4)棧頂元素
SDataType stackTop(stack *ps)
{
assert(ps != NULL);
assert(ps->top > 0);
return ps->array[ps->top - 1];
}
5)是否爲空棧
//空棧返回1,否則返回0
int stackIsEmpty(stack *ps)
{
assert(ps != NULL);
if (ps->top == 0){
return 1;
}
else{
return 0;
}
}
6)棧大小
int stackSize(stack *ps)
{
assert(ps != NULL);
return ps->top;
}
7)棧拷貝
void stackCopy(stack *psDest, stack *psSrc)
{
assert(psDest != NULL);
assert(psSrc != NULL);
psDest->top = psSrc->top;
memcpy(psDest->array, psSrc->array, sizeof(SDataType)* psSrc->top);
}
總結:瞭解了之前順序表博客的內容後,相信對棧的操作就更容易了。因爲棧只能在一端進行操作