虽然以前写代码的时候已经熟悉了栈的结构,但没系统性学习过,正好现在在读一本书,先用c语言实现一个简单的栈结构先
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
//栈内元素
typedef struct StackItem
{
int value;
};
//栈结构
typedef struct Stack
{
StackItem* base;
StackItem* top;
int stracksize;
};
void InitStack(Stack &s) {
//构造一个空栈
s.base = (StackItem*)malloc(STACK_INIT_SIZE * sizeof(StackItem));
if (!s.base)exit(1);
s.top = s.base;
s.stracksize = STACK_INIT_SIZE;
}
int GetTop(Stack& s,StackItem &e) {
//若栈不空,则用e返回s的栈顶元素,并返回1,否则返回0
if (s.top == s.base)
return 0;
e = *(s.top - 1);
return 1;
}
void Push(Stack& s, StackItem e) {
//插入元素e为新的栈顶元素
if (s.top - s.base >= s.stracksize) {
//栈满,追加存储空间
s.base = (StackItem*)realloc(s.base, (s.stracksize + STACKINCREMENT) * sizeof(StackItem));
if (!s.base)exit(1);
s.top = s.base + s.stracksize;
s.stracksize += STACKINCREMENT;
}
*s.top++ = e;
}
int Pop(Stack& s, StackItem &e) {
//若栈不为空,则删除栈顶元素并用e返回其值并返回1,否则返回0
if (s.top == s.base)return 0;
e = *--s.top;
return 1;
}
int StackLength(Stack& s) {
//返回栈的长度
return s.top - s.base;
}
int StackEmpty(Stack& s) {
//判断栈是否为空,如果是返回1,否则返回0
return s.top == s.base ? 1 : 0;
}
void ClesrStack(Stack &s) {
//清空栈
s.top = s.base;
}
void DestoyStack(Stack& s) {
//销毁栈
s.top = s.base;
free(s.base);
s.stracksize = 0;
}