栈-队列的顺序-链式储存结构(数据结构试验报告)
![栈-队列的顺序-链式储存结构(数据结构试验报告)](https://img.360docs.net/img6a/037eclte232vi0zok5hr-a1.webp)
![栈-队列的顺序-链式储存结构(数据结构试验报告)](https://img.360docs.net/img6a/037eclte232vi0zok5hr-d2.webp)
数据结构实验报告
班级:计
学号:
姓名:
设计日期:
西安计算机学院
实验题目
1)栈的顺序存储结构
2)栈的链式存储结构
3)队列的链式存储结构
4)队列的循环存储结构
2.需求分析
本演示程序用C语言编写,完成栈和列的初始化,入栈、出栈、输出操作。
1)对于顺序栈,入栈时要先判断栈是否满了,栈满不能入栈,否则出现空间溢出;在进栈出栈和读取栈顶时先判栈是否为空,为空时不能操作。
2)在一个链队表中需设定两个指针分别指向队列的头和尾。
3)队列的存储结构:注意要判断队满和队空。
4)程序所能达到的功能:完成栈的初始化,入栈,出栈和输出操作;完成队列的初始化,入队列,出队列和输出操作。
3.概要设计
本程序包含
1、栈的顺序存储结构包含的函数:
1)主函数main()
2)入栈函数Push()
3)出栈函数Pop()
2、栈的链式存储结构包含的函数:
1)主函数main()
2)入栈函数PushStack()
3)退栈函数PopStack()
4)取栈顶元素函数Getstack top()
3、队列的链式存储结构所包含的函数:1)主函数main()
2)入队函数EnQueue()
3)出队函数DeQueue()
4 队列的循环所包含的函数:
1)主函数main()
2)初始化循环函数CircSeqQueue()
3)入队函数EnQueue()
4)出队函数DeQueue()
5)取队首元素函数GetFront()
4.详细设计
1)栈的顺序存储结构
#include
#include
#include
#define MAXSIZE 20
typedef int datatype;
typedef struct
{ datatype elem[MAXSIZE];
int top;
}SeqStack;
int init(SeqStack *s)
{ s->top=-1; return 1;}
void print(SeqStack *s)
{char ch; int i;
if(s->top==-1)printf("\n 栈已空.");
else{i=s->top;
while(i!=-1){printf("\n data=%d",s->elem[i]); i--;}
}
printf("\n 按回车继续");ch=getch();
}
void push(SeqStack *s,datatype x)
{if(s->top==MAXSIZE-1) printf("\n 栈已满!");
else s->elem[++s->top]=x;
}
datatype pop(SeqStack*s)
{datatype x;
if(s->top==-1){printf("\n 栈已空! "); x=-1;}
else{x=s->elem[s->top--];}
return(x);
}
void main()
{SeqStack s; int k; datatype x;
if(init(&s))
{do {printf("\n\n\n");
printf("\n***************************************");
printf("\n\n 1. x进栈");
printf("\n\n 2.出栈返回其值");
printf("\n\n 3 结束");
printf("\n***************************************");
printf("\n 请选择(123)");
scanf("%d",&k);
switch(k)
{case 1:{printf("\n 请输入进栈整数X=?");scanf("%d",&x);
push(&s,x);print(&s);
}break;
case 2:{ x=pop(&s);
printf("\n 出栈元素:%d",x);
print(&s);
}break;
case 3:exit(0);
}
printf("n---------");
}while(k>=1 &&k<3);
printf("\n 按回车返回");
getch();
}
else
printf("\n 初始化失败!\n");
}
2).栈的链式存储结构
#include
#include
typedef struct SNode
{
int data;
struct SNode*next;
}SNode,*LinkStack;
LinkStack top;
LinkStack PushStack(LinkStack top,int x)//入栈{
LinkStack s;
s=(LinkStack)malloc(sizeof(SNode));
s->data=x;
s->next=top;
top=s;
return top;
}
LinkStack PopStack(LinkStack top) //退栈{
LinkStack p;
if(top!=NULL)
{
p=top;
top=top->next;
free(p);
printf("退栈已完成\n");
return top;
}
else
printf("栈是空的,无法退栈!\n");
return 0;
}
int GetStackTop(LinkStack top) //取栈顶元素{
return top->data;
}
bool IsEmpty()
{
return top==NULL?true:false;
}
void Print()
{
SNode*p;
p=top;
if(IsEmpty())
{
printf("The stack is empty!\n");
return;
}
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void main()
{
int x,a,b;
char m;
do
{
printf("\n");
printf(" 链栈的基本操作\n");
printf(" \n");
printf(" 1.置空栈\n");
printf(" 2.进栈\n");
printf(" 3.退栈\n");
printf(" 4.取栈顶元素\n");
printf(" 5.退出程序\n");
printf("\n 请选择一个数字(1 2 3 4 5):");
scanf("%c",&m);
switch(m)
{
case '1':
{
top=NULL;
printf("\n栈已置空!");
break;
}
case '2':
{
printf("请输入要进栈的元素个数是:");
scanf("%d",&a);
printf("\n请输入要进栈的%d个元素:",a);