顺序栈即栈的顺序存储结构,它利用一组地址连续的存储单元存放自栈底到栈顶的元素,是一种后进先出(last in first out,LIFO)的线性表。
判断栈不存在的条件为:S.base=NULL;
空栈:S.base=S.top;
满栈:S.top-S.base=S.stacksize;
#include "stdafx.h"
#include <iostream>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int ElemType;
typedef int Status;
using namespace std;
typedef struct Stack
{
int *base;
int *top;
int stacksize; //当前已分配的存储空间
}SqStack;
bool initStack(SqStack &S) {
S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if (!S.base)
{
cout << "内存分配失败!" << endl;
exit(OVERFLOW);
}
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return true;
}
//判断栈是否为空
bool isStackEmpty(SqStack &S) {
if (S.top == S.base)
return true;
else
return false;
}
//取栈顶元素,并将值返回
Status getTop(SqStack &S) {
if (isStackEmpty(S))
{
cout << "栈为空!" << endl;
return 0;
}
return *(S.top - 1);
}
//插入元素e为栈顶元素
Status push(SqStack &S, ElemType e) {
if (S.top - S.base >= S.stacksize) //栈满,追加栈的空间
{
S.base = (ElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(ElemType));
if (!S.base)
{
exit(OVERFLOW);
}
S.top = S.base + S.stacksize; //基地址+当前内存空间
S.stacksize += STACKINCREMENT;
}
*S.top = e;
S.top++;
return true;
}
//删除栈顶元素,并返回
Status pop(SqStack &S) {
ElemType e;
if (isStackEmpty(S))
{
cout << "栈为空!" << endl;
return false;
}
return *(--S.top);
}
//获取栈的长度
Status getStackLength(SqStack &S) {
return S.top - S.base;
}
//清空栈
bool clearStack(SqStack &S) {
while (!isStackEmpty(S))
pop(S);
return true;
}
//销毁栈
bool destroyStack(SqStack &S) {
clearStack(S);
S.stacksize = 0;
S.top = S.base = NULL;
return true;
}
Status visit(ElemType e) {
cout << e << " ";
return true;
}
//遍历栈,遍历顺序为出栈的顺序
void stackTraverse(SqStack &S) {
if (isStackEmpty(S)) {
cout << "栈为空!" << endl;
exit(0);
}
while (!isStackEmpty(S))
{
visit(*(--S.top));
}
cout << endl;
}
int main() {
SqStack stack;
cout << "构造了一个空栈" << endl;;
initStack(stack);
ElemType e;
cout << "向栈中插入第一个元素:";
cin >> e;
push(stack, e);
cout << "向栈中插入第二个元素:";
cin >> e;
push(stack, e);
cout << "向栈中插入第三个元素:";
cin >> e;
push(stack, e);
cout << "获取栈顶元素:" << getTop(stack);
cout << endl << "执行一次出栈操作,出栈元素为:" << pop(stack);
cout << endl << "获取栈顶元素:" << getTop(stack);
cout << endl << "获取栈的长度:" << getStackLength(stack);
cout << endl << "遍历栈:";
stackTraverse(stack);
cout << "执行清栈操作" << endl;;
clearStack(stack);
stackTraverse(stack);
system("pause");
return 0;
}