SeqStack.h 头文件声明如下:
#include <stdio.h>
typedef int DataType; //自定义数据类型,假定为整型
typedef struct SeqStack //顺序栈定义
{
int MAXNUM; //栈存储容量标识
int top; //栈顶位置
DataType *data; //栈存储的元素的指针,可看作一个数组名
}SeqStack;
typedef struct SeqStack * PSeqStack; //顺序栈的指针类型
//创建一个容量为m的空栈
PSeqStack createEmptyStack(int m);
//判断栈是否为空栈
int isEmptyStack(PSeqStack stack);
//判断栈是否已满
int isFullStack(PSeqStack stack);
//进栈,成功返回1,失败返回0
int push(PSeqStack stack,DataType x);
//出栈,成功返回1,失败返回0
int pop(PSeqStack stack);
//取栈顶元素
DataType getTop(PSeqStack stack);
//显示栈内所有元素
void showStack(PSeqStack stack);
//把栈置空
void setEmpty(PSeqStack stack);
//把栈销毁
void destroyStack(PSeqStack stack);
SeqStack.cpp 定义代码如下:
#include <stdio.h>
#include <malloc.h>
#include "SeqStack.h"
//创建一个容量为m的空栈
PSeqStack createEmptyStack(int m)
{
PSeqStack stack=(PSeqStack)malloc(sizeof(struct SeqStack));
if(stack == NULL)
{
printf("存储分配失败,请重建栈!\n");
return NULL;
}
//初始并分配栈元素存储空间,数组第一个元素不使用
stack->data = (DataType *)malloc( (m+1) * sizeof(DataType));
if(stack->data == NULL)
{
printf("存储分配失败,请重建栈!\n");
return NULL;
}
stack->MAXNUM = m; //栈容量
stack->top = 0; //栈内还未存储有元素
return stack;
}
//判断栈是否为空栈
int isEmptyStack(PSeqStack stack)
{
return (stack->top == 0);
}
//判断栈是否已满
int isFullStack(PSeqStack stack)
{
return (stack->top == stack->MAXNUM);
}
//进栈,成功返回1,失败返回0
int push(PSeqStack stack,DataType x)
{
if(isFullStack(stack))
{
printf("栈溢出!\n");
return 0;
}
stack->top =stack->top + 1;
stack->data[stack->top]=x; //存储栈元素数组从下标1开始
return 1;
}
//出栈,成功返回1,失败返回0
int pop(PSeqStack stack)
{
if(isEmptyStack(stack))
{
printf("栈为空!\n");
return 0;
}
stack->top=stack->top-1;
return 1;
}
//取栈顶元素
DataType getTop(PSeqStack stack)
{
if(isEmptyStack(stack))
{
printf("栈为空!取栈顶元素失败!\n");
return NULL;
}
return (stack->data[stack->top]);
}
//显示栈内所有元素
void showStack(PSeqStack stack)
{
if(isEmptyStack(stack))
printf("当前栈为空!无内容。\n");
else
{
int i;
printf("顶--> ");
for(i=stack->top; i>0; i--)
{
printf("%d ",stack->data[i]);
}
printf("-->底\n");
}
}
//把栈置空
void setEmpty(PSeqStack stack)
{
stack->top=0;
}
//把栈销毁
void destroyStack(PSeqStack stack)
{
if(stack)
{
free(stack->data);
stack->top=0;
free(stack);
}
}
main.cpp main函数调用顺序栈操作:
#define _CRT_SECURE_NO_DEPRECATE //解决在VS环境里出现的警告问题
#include <stdio.h>
#include "SeqStack.h"
int main( )
{
char input;
int m;
DataType data;
PSeqStack stack;
do
{
printf("---------------------------------------------\n");
printf("---------------------------------------------\n");
printf("---- 输入对应字符执行以下操作 ----\n");
printf("---- ----\n");
printf("---- \"0\":创建一个空栈 ----\n");
printf("---- \"1\":检查栈是否为空 ----\n");
printf("---- \"2\":检查栈是否已满 ----\n");
printf("---- \"3\":执行入栈操作 ----\n");
printf("---- \"4\":执行出栈操作 ----\n");
printf("---- \"5\":打印栈顶元素 ----\n");
printf("---- \"6\":打印栈内所有元素 ----\n");
printf("---- \"7\":把栈清空 ----\n");
printf("---- \"8\":把栈销毁 ----\n");
printf("---- \"q\":退出程序 ----\n");
printf("---------------------------------------------\n");
printf("---------------------------------------------\n");
printf("选择操作:");
scanf("%c",&input);
switch(input)
{
case '0':
printf("请输入要创建的栈的容量大小:");
scanf("%d",&m);
stack=createEmptyStack(m);
printf("成功创建一个容量为%d的栈。\n",m);
break;
case '1':
if(isEmptyStack(stack))
printf("该栈当前为空栈!\n");
else
printf("该栈当前不为空栈!\n");
break;
case '2':
if(isFullStack(stack))
printf("该栈存储已满!\n");
else
printf("该栈存储未满!\n");
break;
case '3':
fflush(stdin);
printf("请输入要入栈的值:");
scanf("%d",&data);
if( push(stack,data))
{
printf("入栈成功,栈当前内容:");
showStack(stack);
}
else
{
printf("入栈失败,请检查!\n");
}
break;
case '4':
if( pop(stack))
{
printf("出栈成功,栈当前内容:");
showStack(stack);
}
else
{
printf("出栈失败,请检查!\n");
}
break;
case '5':
data=getTop(stack);
printf("栈顶值为:%d\n",data);
break;
case '6':
printf("栈当前内容:");
showStack(stack);
break;
case '7':
setEmpty(stack);
printf("栈当前内容:");
showStack(stack);
break;
case '8':
destroyStack(stack);
printf("成功将栈销毁!\n");
break;
default:
break;
}
printf("\n");
fflush(stdin); /*清空缓冲区,也可以使用rewind(stdin);*/
}while( input != 'q' );
return 0;
}
好!大功告成!!!