#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int DataType;
//支持動態增長的棧
typedef struct Stack
{
DataType* _a;//數組
size_t _top;
size_t _capacity;//棧的容量
}Stack;
//棧的初始化
void StackInit(Stack* s);
//入棧
void StackPush(Stack* s, DataType x);
//出棧
void StackPop(Stack* s);
//返回棧頂數據
DataType StackTop(Stack* s);
//檢查棧是否爲空
int StackIsEmptyr(Stack* s);
//棧的銷燬
void StackDestroy(Stack* s);
//棧的初始化
void StackInit(Stack* s)
{
assert(s);
s->_a = NULL;
s->_top = s->_capacity = 0;
}
//入棧
void StackPush(Stack* s, DataType x)
{
assert(s);//判空
if (s->_top == s->_capacity)//判斷是否需要擴容
{
size_t newcapacity = s->_capacity == 0 ? 4 : s->_capacity * 2;
s->_a = (DataType*)malloc(sizeof(DataType) * newcapacity);
s->_capacity = newcapacity;
}
//不需要擴容則給a[s->_top]賦值, 即進棧
s->_a[s->_top] = x;
++s->_top;
}
//出棧
void StackPop(Stack* s)
{
assert(s);
s->_top--;
}
//返回棧頂數據
DataType StackTop(Stack* s)
{
return s->_a[s->_top - 1];
}
//檢查棧是否爲空
int StackIsEmptyr(Stack* s)
{
return s->_top == 0 ? 1 : 0;
}
//棧的銷燬
void StackDestroy(Stack* s)
{
assert(s);
//釋放空間
free(s->_a);
s->_a = NULL;
s->_capacity = s->_top = 0;
}
//自己實現棧的測試
void testStack()
{
Stack st;
StackInit(&st);
StackPush(&st, 1);
StackPush(&st, 2);
printf("%d ", StackTop(&st));
StackPop(&st);
printf("%d ", StackTop(&st));
StackPop(&st);
StackPush(&st, 3);
StackPush(&st, 4);
while (!StackIsEmptyr(&st))
{
printf("%d ", StackTop(&st));
StackPop(&st);
}
StackDestroy(&st);
}
手動實現一個簡單支持動態增長的棧
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.