栈结构的实现:
1>初始化创建栈结构
2>释放销毁栈结构
3>顺序答应栈元素
4>清空栈
5>判断栈是否为空
6>Push 入栈
7>Pop出栈
8>Top返回栈顶元素
注:数组实现代码如下
#include <iostream>
#include <memory>
#define MaxStackNum 5
#define INCREMENT 3
typedef int DataType;
typedef struct Stack
{
DataType* top; // 栈顶指针
DataType* base; // 栈底指针
int cap; // 当前栈容量
int num; // 当前栈大小
};
// 初始化创建栈结构
int InitStack(Stack& stack)
{
stack.base = (DataType*) malloc(sizeof(DataType) * MaxStackNum);
if (NULL == stack.base)
{
std::cout << "Stack init failed " << std::endl;
exit(0);
}
stack.top = stack.base;
stack.cap = MaxStackNum;
stack.num = -1;
return 1;
}
// 销毁栈结构
void DestoryStack(Stack& stack)
{
if (NULL != stack.base)
{
free(stack.base);
std::cout << "Destory stack succeed ~" << std::endl;
}
}
// 顺序打印栈元素
void PrintStack(Stack& stack)
{
std::cout << "Stack elems [";
DataType* ptr = stack.base;
while( ptr != stack.top)
{
std::cout << " " << *ptr;
ptr++;
}
std::cout << " ]" << std::endl;
}
// 清空栈
void ClearStack(Stack& stack)
{
stack.top = stack.base;
stack.num = -1;
}
// 判断栈是否为空
int Empty(Stack& stack)
{
if (stack.base == stack.top)
return 1;
return 0;
}
// push 元素 入栈操作
void Push(Stack& stack, DataType data)
{
if (stack.top - stack.base + 1 >= stack.cap)
{
// std::cout << "Need Memory" << std::endl;
DataType* tmp = stack.base;
stack.base = (DataType*) realloc(stack.base, sizeof(DataType) * (stack.cap + INCREMENT));
if (NULL == stack.base)
{
std::cout << "Push realloc failed and exit" << std::endl;
free(tmp);
exit(0);
}
stack.cap += INCREMENT;
stack.top = stack.base+stack.num + 1;
}
*stack.top = data;
++stack.top;
++stack.num;
}
// pop 出栈操作
DataType Pop(Stack& stack)
{
if (Empty(stack))
{
std::cout << "Pop failed and stack empty" << std::endl;
exit(0);
}
--stack.top;
--stack.num;
return *(stack.top);
}
// 返回栈顶元素
DataType Top(Stack& stack)
{
if (Empty(stack))
{
std::cout << "Top failed and stack empty" << std::endl;
exit(0);
}
return *(stack.top - 1);
}
#include "stack.h"
int main()
{
Stack stack;
if (InitStack(stack) == 1)
{
std::cout << "Init and create stack succeed~" << std::endl;
}
PrintStack(stack);
std::cout << Empty(stack) << std::endl;
ClearStack(stack);
PrintStack(stack);
for (int i = 1; i <= 10; i++)
Push(stack, i);
PrintStack(stack);
std::cout << Top(stack) << std::endl;
PrintStack(stack);
for(int i = 0; i < 15; i++)
{
Pop(stack);
std::cout << Top(stack) << std::endl;
PrintStack(stack);
}
}