测试截图:
源代码:
//运行环境:VS2015
// 栈的顺序存储表示
//
#include "stdafx.h"
#include<stdlib.h>
#include<stdio.h>
//宏定义
#define STACK_INIT_SIZE 5
#define STACKCREMENT 2
#define ERROR 0
#define OK 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
//定义栈的结构体
typedef struct
{
int *base;
int *top;
int stackSize;
}SqStack;
//初始化栈
int initStack(SqStack &S)
{
//构造一个空战
S.base = (int *)malloc(STACK_INIT_SIZE * sizeof(STACK_INIT_SIZE));
if (!S.base)exit(EOVERFLOW);
S.top = S.base;
S.stackSize = STACK_INIT_SIZE;
return OK;
}
//销毁栈
int destroyStack(SqStack &S)
{
//销毁栈S,S不在存在
free(S.base);
S.base = S.top = NULL;
S.stackSize = 0;
return OK;
}
//设为空栈
int clearStack(SqStack &S)
{
if (S.base == S.top)return OK;
S.top = S.base;
return OK;
}
//判断是否为空栈
bool isEmpty(SqStack S)
{
return S.top == S.base;
}
//返回栈顶元素
int getTop(SqStack S, int &e)
{
if (S.base == S.top)return ERROR;
e = *(S.top - 1);
return OK;
}
//返回栈的长度
int stackLength(SqStack S)
{
return S.top - S.base;
}
//遍历栈
int stackTraverse(SqStack S, int(*visit)(int))
{
while (S.top>S.base)
{
visit(*S.base++);
}
return OK;
}
//visit(int)函数
int visit(int e)
{
printf("%d ", e);
return OK;
}
//入栈
int push(SqStack &S, int e)
{
if (S.top - S.base >= S.stackSize)
{
//栈满,追加存储空间
S.base = (int *)realloc(S.base, (S.stackSize + STACKCREMENT) * sizeof(int));
if (!S.base)exit(OVERFLOW);
S.top = S.base + S.stackSize;
S.stackSize += STACKCREMENT;
}
*S.top++ = e;
return OK;
}
//删除栈顶元素
int pop(SqStack &S, int &e)
{
if (S.base == S.top)return ERROR;
e = *--S.top;
return OK;
}
//测试
int main()
{
SqStack S;
initStack(S);
printf_s("请输入...\n");
while (true)
{
int e;
scanf_s("%d", &e);
if (e == 1234)break;
push(S, e);
}
printf_s("输出所有元素...\n");
stackTraverse(S, visit);
printf_s("\n");
int e;
printf_s("删除一个元素后...\n");
pop(S, e);
printf_s("删除的元素是:%d\n", e);
if (isEmpty(S))
{
printf("栈现在是空的\n");
}
else
{
printf_s("栈现在不是空的\n");
}
printf_s("输出所有元素...\n");
stackTraverse(S, visit);
printf_s("\n");
getTop(S, e);
printf_s("现在栈顶元素是:%d\n", e);
clearStack(S);
printf_s("清空栈后...\n");
if (isEmpty(S))
{
printf("栈现在是空的\n");
}
else
{
printf_s("栈现在不是空的\n");
}
printf_s("请输入...\n");
while (true)
{
int e;
scanf_s("%d", &e);
if (e == 1234)break;
push(S, e);
}
printf_s("输出所有元素...\n");
stackTraverse(S, visit);
printf_s("\n");
destroyStack(S);
printf_s("释放栈后...\n");
if (isEmpty(S))
{
printf("栈现在是空的\n");
}
else
{
printf_s("栈现在不是空的\n");
}
printf_s("请输入...\n");
while (true)
{
int e;
scanf_s("%d", &e);
if (e == 1234)break;
push(S, e);
}
printf_s("序输出...\n");
int n = stackLength(S);
for (int i = 1; i <= n; i++)
{
int e;
pop(S, e);
printf_s("%d ", e);
}
printf_s("\n");
printf_s("现在应该没有元素了...\n");
if (isEmpty(S))
{
printf("栈现在是空的\n");
}
else
{
printf_s("栈现在不是空的\n");
}
return 0;
}