实验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、总体收获和不足,疑问等。
一、实验目的
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、总体收获和不足,疑问等。
在链栈中,运用循环的方式来进行入栈。链栈对比顺序栈没太大的变化,只是一个用数组,一个用指针来实现。
相关文章推荐
- 实验4:栈和队列的基本操作实现及其应用——链栈
- 实验4:栈和队列的基本操作实现及其应用之《链栈》
- 实验4:栈和队列的基本操作实现及其应用之《链栈》
- 实验4:栈和队列的基本操作实现及其应用之《链队列》
- 实验4:栈和队列的基本操作实现及其应用之《排号叫号管理》
- 实验4:栈和队列的基本操作实现及其应用之《顺序队列》
- 实验4:栈和队列的基本操作实现及其应用——链队列
- 实验3:栈和队列的基本操作实现及其应用——十进制转换为二进制
- 实验4:栈和队列的基本操作实现及其应用之《进制转换》
- 实验三:栈和队列的基本操作实现及其应用——顺序栈
- 数据结构:实验四栈和队列的基本操作实现及其应用
- 实验4:栈和队列的基本操作实现及其应用之《链队列》
- 实验4:栈和队列的基本操作实现及其应用之《进制转换》
- 实验3:栈和队列的基本操作实现及其应用——顺序队列和链队列
- 实验4:栈和队列的基本操作实现及其应用之《顺序栈》
- 实验三 栈和队列的基本操作实现及其应用
- 实验4:栈和队列的基本操作实现及其应用之《链队列》
- 实验4:栈和队列的基本操作实现及其应用——循环队列
- 实验三 栈和队列的基本操作实现及其应用 (1)
- 实验4:栈和队列的基本操作实现及其应用——进制转换以及实验总结