当前位置:文档之家› 顺序栈的基本操作讲解

顺序栈的基本操作讲解

上机实验报告
学院:计算机与信息技术学院
专业:计算机科学与技术(师范)课程名称:数据结构
实验题目:顺序栈的基本操作
班级序号:师范1班
学号:************
学生姓名:**
指导教师:***
完成时间:2015年12月25号
一、实验目的:
1.熟悉掌握栈的定义、结构及性质;
2.能够实现创建一个顺序栈,熟练实现入栈、出栈等栈的基本操作;
3.了解和掌握栈的应用。

二、实验环境:
Microsoft Visual c++ 6.0
三、实验内容及要求:
栈是一种特殊的线性表,逻辑结构和线性表相同,只是其运算规则有更多的限制,故又称为受限的线性表。

建立顺序栈,实现如下功能:
1.建立一个顺序栈
2.输出栈
3.进栈
4.退栈
5.取栈顶元素
6.清空栈
7.判断栈是否为空
进行栈的基本操作时要注意栈"后进先出"的特性。

四、概要设计:
1、通过循环,由键盘输入一串数据。

创建并初始化一个顺序栈。

2、编写实现相关功能函数,完成子函数模块如下。

3、调用子函数,实现菜单调用功能,完成顺序表的相关操作
五、代码:
#include<stdio.h>
#include<stdlib.h>
#define maxsize 64
typedef int datatype;
//定义结构体
typedef struct
{
datatype data[maxsize];
int top;
}seqstack;
//建立顺序栈
seqstack *SET(seqstack *s)
{
int i;
s=(seqstack*)malloc(sizeof(seqstack));
s->top=-1;
printf("请输入顺序栈元素(整型,以0结束):");
scanf("%d",&i);
do{
s->top++;
s->data[s->top]=i;
scanf("%d",&i);
}while(i!=0);
printf("顺序栈建立成功\n");
return s;
}
//清空栈
void SETNULL(seqstack *s)
{
s->top=-1;}
//判断栈空
int EMPTY(seqstack *s)
{
if(s->top>=0)
return 0;
else return 1;}
//进栈
seqstack *PUSH(seqstack *s)
{
int x;
printf("你想要插入的数字:");
scanf("%d",&x);
if(s->top==maxsize-1)
{
printf("overflow");
return NULL;
}
else
{
s->top++;
s->data[s->top]=x;
}
return s;
}
//退栈
seqstack *POP(seqstack *s)
{
if(s->top<0)
{
printf("underlow");
return s;
}
else
{
s->top--;
printf("删除的栈顶元素是:");
printf("%d\n",(s->data[s->top+1]));
}
return s;
}
//取栈顶
void TOP(seqstack *s)
{
if(s->top<0)
{
printf("stack is empty");
}
else
{
printf("当前的栈顶元素是:");
printf("%d\n",(s->data[s->top]));
}
}
//输出栈
void print(seqstack *s)
{
int i;
if(s->top<0)
{
printf("清空栈成功!");
}
for(i=s->top;i>=0;i--)
printf("%d ",s->data[i]);
}
//主函数
int main()
{
seqstack *s;
int i,j;
printf("\n\n\t\t\t\t欢迎使用\n");
printf("\t\t___________________________________________\n"); printf("\t\t\t1.建立一个顺序栈\n");
printf("\t\t\t2.输出栈\n");
printf("\t\t\t3.进栈\n");
printf("\t\t\t4.退栈\n");
printf("\t\t\t5.取栈顶元素\n");
printf("\t\t\t6.清空栈\n");
printf("\t\t\t7.判断栈是否为空\n");
printf("\t\t\t8.结束程序\n");
printf("\t\t___________________________________________\n");
do
{
printf("\n\n请选择想要实现的功能:");
scanf("%d",&i);
switch(i)
{
case 1:s=SET(s);
break;
case 2:print(s);
printf("\n");break;
case 3:s=PUSH(s);
print(s);
printf("\n");break;
case 4:s=POP(s);
print(s);
printf("\n");
break;
case 5:TOP(s);
break;
case 6:SETNULL(s);
print(s);
printf("\n");
break;
case 7:j=EMPTY(s);
if(j==1)
printf("空栈\n");
else
printf("非空栈\n");
break;
case 8:printf("_________________谢谢使用__________________\n");
exit (0);
}
}while(1);
return 0;
}
六、运行界面
菜单
功能
七、实验中遇到的问题及总结
1.在写主函数时,如果是用void main的形式,那么可以不用有返回值,如果是int main 或status main的话,要有返回值,即末尾要有return语句。

2.应当注意,在算法POP中,删去栈顶元素只要将栈顶指针减1即可,但该元素在下次进栈之前仍是存在的。

2.本次实验加强了对栈的理解和认识以及栈的应用,实现栈的相关操作。

八、参考文献
《数据结构——用C语言描述》。

相关主题