顺序栈
1.实验目的
掌握栈的特点(先进后出)及其基本操作。如入栈、出栈等,栈的顺序存储结构和链式存储结构,以便在实际问题中灵活运用。
2.实验内容
创建一个顺序栈,实现数据的入栈和出栈运算,进而验证栈的先进后出的特性。步骤如下:
- 创建入栈和出栈函数;
- 在主函数中输入数据,以“\0”做结束标志,调用入栈和出栈函数。
3.实验工具
Visual C++
4.实验代码
如下:
//Authors:xiaobei
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
char *base;
char *top;
int stacksize;
}SqStack;
void InitStack(SqStack &S); //S为结构体名,是首地址,用&来取址
void Push(SqStack &S,char e);
void Pop(SqStack &S,char &e);
void menu();
int main()
{
SqStack stack_a;
int i,user,n;
char E[5],e;
InitStack(stack_a);
while(1)
{
menu();
scanf("%d",&user);
switch(user)
{
case 1:{
printf("请输入入栈元素:");
getchar();
gets(E);
for(i=0;i<5;i++)
{
//scanf(" %c",&e);
//%c前加空格,或者前用getchar(),防止scanf在接收字符时接收到“\n”
//E[i]=="\0"时结束
if(E[i])
Push(stack_a,E[i]);
else
break;
}
};break;
case 2:{
printf("请输入出栈元素个数:");
scanf("%d",&n);
for(i = 0;i<n;i++)
{
Pop(stack_a,e);
};break;
}
case 0:exit(0);
}
}
return 0;
}
//打印菜单
void menu()
{
printf("\n*************\n1.入栈\n2.出栈\n0.退出\n*************\n>>>");
}
//栈的初始化
void InitStack(SqStack &S)
{
S.base = (char*)malloc(5*sizeof(char));
if(!S.base)
{
printf("内存分配失败!\n");
exit(0);
}
S.top = S.base;
S.stacksize = 5;
printf("内存分配成功!\n");
}
//入栈
void Push(SqStack &S,char e)
{
if(S.top - S.base == S.stacksize)
printf("栈满!\n");
else
{
*S.top++ = e;
printf("%c入栈成功!\n",e);
}
}
//出栈
void Pop(SqStack &S,char &e)
{
if(S.top == S.base)
printf("栈空!\n");
else
{
e = *--S.top;
printf("%c出栈成功!\n",e);
}
}
5.总结
- 栈是“先进后出”。
- 顺序栈在栈顶进行操做。
- 栈满的标志是top-base == size。
- 栈是有限制的顺序表。注意取值与取址的适用情况。