顺序栈基于数组的数据结构,故在定义栈的数据结构中,关键是top(栈顶的变化过程),值得注意的一点是top的取值是-1,以及malloc的用法。
下面是C语言用法
//顺序栈
#include<stdio.h>
#include<malloc.h>
#define stackSize 10
//栈的数据结构(用数组实现)
typedef struct
{
int top;
int size;
int data[stackSize];
}stack,*sqStack;
//建立新栈
sqStack Create()
{
sqStack S=(stack *)malloc(stackSize * sizeof(stack));
S->size = stackSize;
S->top = -1;
printf("成功建立一个长度为%d的栈\n",stackSize);
return S;
}
//判断栈空满并返回栈中元素个数
int IsFull(sqStack S)
{
if (S->top == -1)
{
printf("栈已空\n");
return false;
}
else
{
if (S->top == (S->size - 1))
{
printf("栈已满\n");
return true;
}
else
{
printf("栈中有%d个元素\n",S->top+1);
}
}
}
//入栈
int InStack(sqStack S,int P)
{
if (S->top == (S->size - 1))
{
printf("栈已满,出栈后再执行操作\n");
}
else
{
printf("请输入入栈元素");
scanf_s("%d", &P);
S->top = S->top + 1;
S->data[S->top] = P;
printf("成功入栈,入栈元素为%d\n", S->data[S->top]);
return P;
}
};
//出栈
int OutStack(sqStack S)
{
if (S->top == -1)
{
printf("栈已空,入栈后再执行操作\n");
}
else
{
printf("出栈成功,出栈元素为%d\n", S->data[S->top--]);
}
return S->top + 1;
}
//查看栈顶元素
int VistStack(sqStack S)
{
if (S->top == -1)
{
printf("栈已空,入栈后再执行操作\n");
}
else
{
printf("栈顶元素为%d", S->data[S->top]);
return S->data[S->top];
}
}
//打印栈
void Printstack(sqStack S)
{
int i = 0;
printf("栈底|");
for (i = 0; i <= S->top; i++)
{
printf("%d ", S->data[i]);
}
printf("<-栈顶");
}
//主函数
void main()
{
int i;
stack S;
sqStack Sq;
Sq = &S; //Sq的初始化
do
{
printf("\n------------****------------\n");
printf("请输入要执行的操作序号\n");
printf("1.建立空栈\n");
printf("2.入栈\n");
printf("3.出栈\n");
printf("4.查看栈顶元素\n");
printf("5.打印栈\n");
printf("6.判断栈空/满\n");
printf("0.退出");
printf("\n------------****------------\n");
printf("请输入序号:");
scanf_s("%d", &i);
printf("\n");
switch (i)
{
case 1: Sq=Create(); break;
case 2:InStack(Sq,i); break;//i为任意的整数,为了节省空间故用i代替
case 3:OutStack(Sq); break;
case 4:VistStack(Sq);break;
case 5:Printstack(Sq); break;
case 6:IsFull(Sq); break;
case 0:printf("结束"); break;
default:printf("输入错误!请输入0---6的整数");
}
} while (i != 0);
getchar();
}