您的位置:首页 > 其它

实验4:栈和队列的基本操作实现及其应用之《链栈》

2017-10-17 20:11 561 查看
实验4:栈和队列的基本操作实现及其应用之链栈


一、实验目的

1、   熟练掌栈和队列的结构特点,掌握栈和队列的顺序存储和链式存储结构和实现。

2、   学会使用栈和队列解决实际问题。


二、实验内容

1、自己确定结点的具体数据类型和问题规模:

分别建立一个顺序栈和链栈,实现栈的压栈和出栈操作。

分别建立一个顺序队列和链队列,实现队列的入队和出队操作。

2、设计算法并写出代码,实现一个十将二进制转换成2进制数。

3、选做题(*)

设计一个模拟饭堂排队打饭管理软件,实现“先来先打饭”的排号叫号管理。


三、实验步骤

1、依据实验内容分别说明实验程序中用到的数据类型的定义

    实验中选用的是整型来进行栈的数据输入。


2、相关操作的算法表达;

   入栈:只需处理栈顶即第一个位置的情况,而无需考虑其他位置的情况。

   出栈:只需处理栈顶即第一个位置的情况,而无需考虑其他位置的情况。

3、完整程序;   

#include<iostream>
using namespace std;
const int S=10;
struct Node
{
int data;
Node *next;
};
class LinkStack
{
public:
LinkStack(){top=NULL;}
~LinkStack(){}
void Push(int x);
int Pop();
int Gettop(){ if(top!=NULL) return top->data; }
int Empty(){if(top==NULL)return 1; else return 0;}
private:
Node *top;
};
void LinkStack::Push(int x)
{
Node *s;
s=new Node;s->data=x;
s->next=top;
top=s;
}
int LinkStack::Pop()
{
int x;
Node *p;
if(top==NULL) throw"下溢";
x=top->data;p=top;
top=top->next;
delete p;
return x;
}

int main()
{
int i,s,x;
LinkStack Stact;
do
{
cout<<endl<<"\t\t\t 链栈"<<endl<<"\t\t\t输入进栈的数:";
cin>>i;
cout<<"\t\t\t是否继续输入?(1/0):";
cin>>s;
Stact.Push(i);
}
while(s);

while(1)
{
cout<<endl<<"\t\t\t 链栈";
cout<<endl<<"\t\t\t 1、入栈";
cout<<endl<<"\t\t\t 2、出栈";
cout<<endl<<"\t\t\t 3、栈顶数";
cout<<endl<<"\t\t\t 4、栈是否为空";
cout<<endl<<"\t\t\t请选择操作(0-4):";
cin>>x;
cout<<endl;
if(x==0)
break;
switch(x)
{
case 1:
{
do
{
cout<<endl<<"\t\t\t输入进栈的数:";
cin>>i;
cout<<"\t\t\t是否继续输入?(1/0):";
cin>>s;
Stact.Push(i);
}
while(s);
break;
}
case 2:
{
cout<<"\t\t\t出栈:"<<Stact.Pop()<<endl;
break;
}
case 3:
{
cout<<"\t\t\t栈顶数:"<<Stact.Gettop()<<endl;
break;
}
case 4:
{
cout<<"\t\t\t栈是否为空:"<<Stact.Empty();
break;

}
default:
{
cout<<"\t\t\t请输入数字(0-5)!"<<endl;
}
}
}
}

4、总结、运行结果和分析。


 


5、总体收获和不足,疑问等。


      在链栈中,运用循环的方式来进行入栈。链栈对比顺序栈没太大的变化,只是一个用数组,一个用指针来实现。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐