实验5 栈和队列的应用
目的和要求:
(1)熟练栈和队列的基本操作;(2)能够利用栈与队列进行简单的应用。
一、题目
题目1.利用顺序栈和队列,实现一个栈和一个队列,并利用其判断一个字符串是否是回文。所谓回文,是指从前向后顺读和从后向前倒读都一样的字符串。例如,a+b&b+a等等。
题目2.假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题,并实现。
题目3.打印机提供的网络共享打印功能采用了缓冲池技术,队列就是实现这个缓冲技术的数据结构支持。每台打印机具有一个队列(缓冲池),用户提交打印请求被写入到队列尾,当打印机空闲时,系统读取队列中第一个请求,打印并删除之。请利用队列的先进先出特性,完成打印机网络共享的先来先服务功能。
题目4.假设以数组Q[m]存放循环队列中的元素, 同时设置一个标志tag,以tag == 0和tag == 1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“满”。试编写与此结构相应的插入(enqueue)和删除(dlqueue)算法。
题目5.利用循环链队列求解约瑟夫环问题。
请大家从本组未讨论过的五道题中选择一道,参照清华邓俊辉老师MOOC视频及课本相关知识,编写相应程序。
选择题目3:
打印机提供的网络共享打印功能采用了缓冲池技术,队列就是实现这个缓冲技术的数据结构支持。
二、程序清单
//Ch3.cpp #include #include #include“ch3.h” template void LinkedQueue::makeEmpty()//makeEmpty//函数的实现 { LinkNode*p;while(front!=NULL)//逐个删除队列中的结点
{
p=front;
front=front->link;
delete p;} };template bool LinkedQueue::put_in(T&x){//提交命令函数
if(front==NULL){//判断是否为空
front=rear=new LinkNode;//如果为空,新结点为对头也为对尾
front->data=rear->data=x;
if(front==NULL)//分配结点失败
return false;} else{
rear->link=new LinkNode;//如不为空,在链尾加新的结点
rear->link->data=x;
if(rear->link==NULL)
return false;
rear=rear->link;} return true;};template bool LinkedQueue::carry_out()//执行命令函数 { if(IsEmpty()==true)//判断是否为空
{
return false;} cout<data<<“ ”;//输出链尾的数据,代表执行打印命令
LinkNode*p=front;front=front->link;//删除以执行的命令,即对头修改
delete p;//释放原结点
return true;};void main()
//主函数 { LinkedQueue q;//定义类对象
char flag='Y';
//标志是否输入了命令
const int max=30;//一次获取输入命令的最大个数 while(flag=='Y')//循环 { int i=0;char str[max];//定义存储屏幕输入的命令的数组
gets(str);//获取屏幕输入的命令
while(str[i]!=' '){
q.put_in(str[i]);//调用提交命令函数,将每个命令存入队列中
i++;
}
for(int j=0;j<=i;j++){
if(q.IsEmpty()==true)//判断是否为空,为空则说明没有可执行的命令
{
cout<<“已经没有可执行的命令!是否继续输入命令(Y|N)?”<cin>>flag;continue;//为空跳出for循环为下次输入命令做好准备
}
q.carry_out();//调用执行命令的函数,将命令打印并删除
}
三、程序调试过程中所出现的错误 无。
四、运行结果:
五、心得体会
打印机采用的缓冲池技术,本质上就是利用了队列的先进先出的特点,体现了先来后到原则。虽然意思很简单,但是实际编程过程中,出现bug的概率还是蛮高的,因为在编写程序中一点疏忽就容易产生错误。
本来我对模板类的使用还是很模糊的,通过这个例子,至少让我清楚了模板类的使用和特点。觉得模板类的恰当使用,对于自己今后的编程好处还是很大的。
实验二 栈和队列及其应用
一、实验目的
1.掌握栈和队列这两种抽象数据类型的特点,并能在相应的应用问题中正确选用它们。
2.熟练掌握栈类型的两种实现方法。
3.熟练掌握循环队列和链队列的基本操作实现算法。
二、实验内容
用队列求解迷宫问题 [问题描述] 以一个M*N的长方阵表示迷宫,0和1分别表示迷宫中的通路和墙壁。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。[基本要求] 实现一个以顺序存储结构的队列类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,pre)的形式输出,其中:(i,j)指示迷宫中的一个坐标,pre表示本路径中上一个方块在队列中的下标。
[测试数据] 由学生任意指定。
三、源代码
# include #define M 5 #define N 5
//行数 //列数
//队最多元素个数
//一个迷宫,其四周要加上均为1的外框{1,1, #define MaxSize 100 int mg[M+2][N+2]={ {1,1,1,1,1,1,1}, {1,0,0,0,0,0,1}, {1,0,1,0,0,1,1}, {1,0,1,0,0,1,1}, {1,0,1,0,1,0,1}, {1,0,0,0,0,0,1}, {1,1,1,1,1,1,1} };
typedef struct {int i,j;int pre;} Box;typedef struct { Box data[MaxSize];int front, rear;}QuType;void mgpath1(int xi,int yi,int xe,int ye)//搜索路径为:(xi,yi){ void print(QuType qu, int front);->(xe,ye)
int i,j,find=0,di;QuType qu;//定义顺序队 qu.front=qu.rear=-1;qu.rear++;qu.data[qu.rear].i=xi;//(xi,yi)进队 qu.data[qu.rear].j=yi;qu.data[qu.rear].pre=-1;mg[xi][yi]=-1;while(qu.front!=qu.rear&&!find){qu.front++;i=qu.data[qu.front].i;j=qu.data[qu.front].j;if(i==xe&&j==ye){find=1;print(qu,qu.front);
}
for
(di=0;di<4;di++)
{
switch(di)
{
case 0 :i=qu.data[qu.front].i-1;j=qu.data[qu.front].j;break;case 1 :i=qu.data[qu.front].i;j=qu.data[qu.front].j+1;break;case 2 :i=qu.data[qu.front].i+1;j=qu.data[qu.front].j+1;break;case 3 :i=qu.data[qu.front].i;j=qu.data[qu.front].j-1;break;
}
if(mg[i][j]==0)
{find=1;
qu.rear++;
qu.data[qu.rear].i=i;qu.data[qu.rear].j=j;
qu.data[qu.rear].pre=qu.front;
mg[i][j]=-1;
}
} } }
void print(QuType qu, int front){
int k=front,j,ns=0;
printf(“n”);do
{j=k;
k=qu.data[k].pre;
qu.data[j].pre=-1;
} while(k!=0);printf(“迷宫路径如下:n”);k=0;while(kns++;
printf(“t(%d,%d)”,qu.data[k].i,qu.data[k].j);
if(ns%5==0)printf(“n”);} k++;} printf(“n”);} void main()
{ mgpath1(1,1,M,N);printf(“迷宫所有路径如下:n”);
}
四、测试结果:
五、心得体会
做实验首先要掌握大量的理论知识,然后认真去完成实验。做实验过程会碰见较大的困难,这就要需要我们的毅力。小小的迷宫隐藏大大的奥秘。
一、实验目的 掌握栈的数据类型描述及栈的特点; 掌握栈的顺序存储结构的特点及算法描述; 掌握队列的数据类型描述及链式存储结构的特点和算法描述。
二、实验内容
停车场管理。设有一个可以停放n辆汽车的狭长停车场(先进后出),它只有一个大门可以供车辆进出。车辆按到达停车场时间的先后依次从停车场最里面向大95E8口处停放(最先到达的第一辆车停放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车离开,则排在便道上的第一辆车就可以进入停车场。停车场内如有某辆车要离开,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车再按原来的次序进停车场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车没进停车场就要离开,允许其离开,不收停车费,并且仍然保持在便道上的车辆次序。试编程模拟停车场管理。
三、算法描述
提示:可以将停车场定义成一个顺序栈s1,便道定义成一个链队列q,而停车场中的某辆车要离开,则在它后面进停车场的车必须让道,让其离开,故还必须有一个临时的顺序栈s2,存放让道的车辆。
当有车辆进停车场时,直接进入s1栈,若s1栈满,则进入便道(链队列q)。若有s1中车辆x离开时,先让在x后面进栈的车从s1退栈并进栈到s2中,让x离开并收取停车费,然后,再把s2中的所有车辆退栈并重新进入s1栈,最后,将链队列q的队头车辆进栈到s1中并删除队头车辆。若有链队列q(便道)中的车辆y离开时,从链队列中删除该车辆即可,不收停车费。
车辆的数据可以表示为(车辆编号,到达/离开时间)。
四.程序清单: #include using namespace std;const int StackSize=5;class SeqStack { public:
SeqStack(){top=-1;} ~SeqStack(){};void Push(int x);void Push2(int x);int *Return();int Pop(int y);int Count();void PrintStack();private: int data[StackSize];int top;};//入栈
void SeqStack::Push(int x){ if(top>=StackSize-1)throw“上溢”;for(int i=0;i<=top+1;i++){
if(data[i]==x)
{
cout<<“该车牌已经存在!请重新输入: ”;
i=-1;
cin>>x;
} } top++;data[top]=x;} //返回数组地址
int *SeqStack::Return(){ return data;} //临时栈
void SeqStack::Push2(int x){ top++;data[top]=x;
} //输出函数
void SeqStack::PrintStack(){ for(int i=0;i<=top;i++)
cout<<“位置为”<
int SeqStack::Pop(int y){ if(top==-1)throw“下溢”;int x;x=data[top--];if(y==top+2)data[top+1]=123456789;if(top==-1)data[top+1]=123456789;return x;} //数数
int SeqStack::Count(){ return top;}
//队列
struct Node { int data;Node *next;};class LinkQueue { public: LinkQueue();void EnQueue(int x,int *q);void xzDeQueue(int x);int Count();int DeQueue();
private: Node *front,*rear;};//构造函数
LinkQueue::LinkQueue(){ Node *s=new Node;s->next=NULL;front=rear=s;} //入队
void LinkQueue::EnQueue(int x,int *q){ Node *s=new Node;Node *p=new Node;p=front;while(p){
if(p->data ==x)
{
cout<<“便道已有该车牌号,请重新输入: ”;
cin>>x;
for(int i=0;i<5;i++)
{
if(x==q[i])
{
cout<<“停车场已有该车牌号,请重新输入: ”;
cin>>x;
i=-1;
}
}
p=front;} p=p->next;} s->data =x;s->next =NULL;
rear->next =s;rear=s;} //出队
int LinkQueue::DeQueue(){ if(front==rear)throw“便道无车辆”;Node *p=new Node;int x;p=front->next;x=p->data;front->next =p->next;if(p->next ==NULL)rear=front;delete p;return x;} //计算结点数
int LinkQueue::Count(){ Node *p=new Node;p=front;int i=0;while(p&&p->next!=NULL){
p=p->next;
i++;} return i;} //选择性出队
void LinkQueue::xzDeQueue(int x){ if(rear==front)throw“便道无车辆”;Node *p=new Node;p=front;int y;int i=0;for(;p->next!=NULL;p=p->next)
{
if(p->next->data ==x)
if(p->next->next!=NULL)
{
Node *q=new Node;
q=p->next;
y=q->data;
p->next =q->next;
i=1;
delete q;
cout<<“车牌号为:”<break;
}
else
{
Node *q=new Node;
q=p->next;
y=q->data;
p->next =NULL;
i=1;
delete q;
if(front->next==NULL)rear=front;
cout<<“车牌号为:”<break;
}
} if(i==0)cout<<“无车牌号为:”<SeqStack b;//b是作为临时存放车辆的栈
LinkQueue c;//c是作为便道的队列
cout<<“tttt1.车辆进入”<cout<<“tttt4.便道车辆离开”<int xh1=1;//xh1为菜单最外层的循环控制变量
int time[100];//记录各车辆进入停车场的时间
int t1=0;//作为车辆对应的时间编号
int money=1;while(xh1==1){
cout<<“请选择指令: ”;
cin>>zl;
switch(zl)
{
case 1:
try{
int n1=a.Count();
int n;
cout<<“请输入车牌号: ”;
cin>>n;
if(n1==4)
{
int *Num=a.Return();
for(int i=0;i<=4;i++)
if(Num[i]==n)
{
cout<<“停车场已有该车牌号,请重新输入!”;
cin>>n;
i=-1;
}
int *CarNum=a.Return();
c.EnQueue(n,CarNum);
cout<<“停车场已满,请在便道等候!”<break;
}
a.Push(n);
cout<<“请输入进入时间: ”;
cin>>time[t1];
while(time[t1]<0||time[t1]>=24)
{
cout<<“请输入正确的时间(0~23时):”;
cin>>time[t1];
}
t1++;
}
catch(char*s){cout<
break;
case 2:
try{int n2;//离开车辆的编号
cout<<“请输入要离开的车的位置: ”;
cin>>n2;
if(a.Count()+1==0)
{
cout<<“该停车场没有车辆,请选择其他操作!”;
break;
}
else
while(n2<1||n2>a.Count()+1)
{
cout<<“请输入1~”<cin>>n2;
}
int j=a.Count();
for(int i=0;i<(j+1-n2);i++)
b.Push2(a.Pop(n2));
a.Pop(n2);
int j2=b.Count();
for(int i1=0;i1<=j2;i1++)
a.Push(b.Pop(n2));
int j3=c.Count();
int time1;
cout<<“请输入离开时间: ”;
cin>>time1;
while(time1<0||time1>23)
{
cout<<“请输入正确的时间(0~23时): ”;
cin>>time1;
}
int day=0;
if(time1{
cout<<“离开时间已小于进入时间!请加上停留天数(天):”;
cin>>day;
while(day<=0)
{
cout<<“输入的天数必须大于0:”;
cin>>day;
}
}
cout<<“您的费用是(元): ”<<(time1-time[n2-1]+24*day)*money<for(int i2=0;i2<(j+1-n2);i2++)
time[n2-1+i2]=time[n2+i2];
t1--;
if(j3!=0)
{
a.Push(c.DeQueue());
cout<<“ttt通知: 便道车辆请进入停车场!”<cout<<“请输入进入时间: ”;
cin>>time[t1];
while(time[t1]<0||time[t1]>=24)
{
cout<<“请输入正确的时间(0~23时):”;
cin>>time[t1];
}
t1++;
}
}catch(char *s){cout<
break;
case 3:
a.PrintStack();break;
case 4:
int n3;
cout<<“请输入离开车辆的车牌号: ”;
cin>>n3;try{
c.xzDeQueue(n3);}catch(char*s){cout<
break;
case 5:
cout<<“请输入单价: ”;
cin>>money;
cout<<“修改成功!”<cout<<“当前停车场的费用是:”<break;
case 6:
xh1=0;
break;
} } system(“pause”);}
心得体会:
完成时间:2010-10-30
实验报告三 栈和队列
班级: 姓名: 学号: 专业:
一、实验目的:
(1)掌握栈的基本操作的实现方法。
(2)利用栈先进后出的特点,解决一些实际问题。(3)掌握链式队列及循环队列的基本操作算法。(4)应用队列先进先出的特点,解决一些实际问题。
二、实验内容:
1、使用一个栈,将一个十进制转换成二进制。粘贴源程序:
package Word1;
public class Node {
} T data;Node next;public Node(T a){ } public Node(T a,Node n){
} this.data=a;this.next=n;this(a,null);
-----package Word1;
public class Stack {
} public Node Top;public Stack(){ } public void push(T a){ } public T Out(){
}
T a=this.Top.data;this.Top=this.Top.next;return a;this.Top=new Node(a,this.Top);this.Top=null;
--package Word1;
import java.util.*;
public class Test {
} static Scanner scan=new Scanner(System.in);static int temp=0;static int a=0;static Stack s=new Stack();public static void main(String[] args){
} temp=scan.nextInt();while(true){
} while(s.Top!=null){
} System.out.printf(“%d”,s.Out());a=temp%2;s.push(a);temp=temp/2;if(temp==0)break;
粘贴测试数据及运行结果:
2、回文是指正读反读均相同的字符序列,如“acdca”、“dceecd”均是回文,但“book”不是回文。利用1中的基本算法,试写一个算法判定给定的字符串是否为回文。(提示:将一半字符入栈,依次弹出与另一半逐个比较)粘贴源程序:---------package Word1;
import java.util.*;public class Test1 {
} static Scanner sc=new Scanner(System.in);static char[] c={'a','b','c','b','a'};static Stack s=new Stack();public static void main(String[] args){
} public static String One(){
} public static String Two(){
} for(int i=0;i<(c.length/2);i++){ } for(int i=c.length/2;i} return “该字符串是回文”;if(s.Out()!=c[i])return “该字符不是回文”;s.push(c[i]);for(int i=0;i<(c.length/2);i++){ } for(int i=c.length/2+1;i} return “该字符串是回文”;if(s.Out()!=c[i])return “该字符串不是回文”;s.push(c[i]);if(c.length%2!=0){
} else{ } System.out.println(Two());System.out.println(One());
-------------
粘贴测试数据及运行结果:
3、使用3个队列分别保留手机上最近10个“未接来电”、“已接来电”、“已拨电话”。
粘贴源程序:
package Word3;
import java.util.*;
public class Queue {
LinkedList list;public Queue(){ } public void enQ(E a){ } public E deQ(){ } public boolean isEmpty(){ } public void Pri(){ while((list.isEmpty()))return list.isEmpty();return list.removeLast();list.addLast(a);list=new LinkedList();
} } System.out.printf(“%d n”,this.deQ());
package Word3;
import java.util.*;
public class Test {
static Queue list1=new Queue();static Queue list2=new Queue();static Queue list3=new Queue();static Scanner sc=new Scanner(System.in);public static void main(String[] args){ } public static void Frame(){
} static private void T2(){
int c;int[] a={22324,321321,222333};for(int i=0;i1、查询
2、增加”);c=sc.nextInt();if(c==1){
} else{ c=sc.nextInt();while(!(list2.isEmpty()))System.out.printf(“%d n”,list2.deQ());list2.enQ(a[i]);int c=0;System.out.println(“请选择记录类型:”);System.out.println(“
1、未接来电
2、已接来电
3、已拨电话”);switch(c=sc.nextInt()){
} case 1:T1();break;case 2:T2();break;case 3:T3();break;Frame();
}
} list2.enQ(c);while(!(list2.isEmpty()))System.out.printf(“%d n”,list2.deQ());sc.close();static private void T3(){
} static private void T1(){
int c;int[] a={12324,321321,222333};for(int i=0;i1、查询
2、增加”);c=sc.nextInt();if(c==1){
} else{ c=sc.nextInt();while(!(list1.isEmpty()))System.out.printf(“%d n”,list1.deQ());list1.enQ(a[i]);int c;int[] a={32324,321321,222333};for(int i=0;i1、查询
2、增加”);c=sc.nextInt();if(c==1){
} else{
} sc.close();c=sc.nextInt();list3.enQ(c);while(!(list3.isEmpty()))System.out.printf(“%d n”,list3.deQ());while(!(list3.isEmpty()))System.out.printf(“%d n”,list3.deQ());list3.enQ(a[i]);
}
}
} list1.enQ(c);while(!(list1.isEmpty()))System.out.printf(“%d n”,list1.deQ());sc.close();
粘贴测试数据及运行结果:
三、心得体会:(含上机中所遇问题的解决办法,所使用到的编程技巧、创新点及编程的心得)
栈和队列上机实习
1、实验目的:
(1)熟练掌握栈的逻辑结构和操作规则,能在相应的实际问题中正确选用该结构。(2)熟练掌握栈的2种存储结构实现方法(顺序栈和链栈),两种存储结构和基本运算的实
现算法,注意栈空盒满的判断条件及它们的描述方法。
(3)熟练掌握队列的逻辑结构和操作规范,能在相应的实际问题中正确选用该结构。(4)掌握循环队列与链队列两种存储结构的实现,熟练掌握各种队列基本运算的实现。
2、实验要求:
(1)顺序栈的插入、删除,栈顶数据元素的读取。(2)链栈的插入、删除,栈顶数据元素的读取。(3)循环队列的插入、删除。(4)链队列的插入、删除。
3、实验内容: ① 栈
(1)抽象数据类型定义
typedef struct
{
ElemType data[MaxSize];
//栈的空间大小为MaxSize
int top;
//设置栈顶指针
}SqStack;
//栈的结构定义
在本次实验中,首先建立一个空栈,进入主程序后首先初始化栈为其分配空间,然后进入菜单选择界面,通过不同的数字输入,实现入栈,出栈,读取栈顶元素,显示栈的所有元素,栈的长度,释放栈等操作。
(2)存储结构定义及算法思想
在栈结构体的定义中,typedef int Typeelem 为整型,存储结构(入栈)如下:
cin>>a;
s->top++;
//在入栈是首先将栈顶指针向上加1
s->data[s->top]=a;
//与数组赋值一样,直接赋值
//其他存储与此类似,都是直接赋值与数组的某一位
退栈函数模块:
void Pop(SqStack * &s){
//对指针的引用
if(s->top ==-1){
cout<<“栈是空栈,不能退栈”<//首先判断是否为空栈,若为空,则退出
return;} cout<<“退栈的元素为:”<data[s->top]<//显示退栈元素
s->top--;
//栈顶元素减1,指向实际栈的最上面 }
显示栈所有元素函数模块:
void DispStack(SqStack *s){
//从栈顶到栈底顺序显示所有元素
int i;cout<<“栈的元素分别为:”<top;i>=0;i--){ cout<data[i]<<“ ”;
//同过循环实现实现从栈顶元素到栈底元素的遍历以输出
} cout<栈结构的入栈和退栈是两个相反的过程,先进后出,入栈是先让栈顶指针加1,指向未被赋值位置,然后进行赋值,退栈是先取出退栈元素,然后栈顶元素减1,指向推展后的实际栈顶。诸如读取栈顶元素,显示栈的元素,读取栈的长度,都是用过对栈顶指针实现相关操作。
(3)实验结果与分析
② 循环队列
(1)抽象数据类型定义
typedef struct {
ElemType elem[Maxqsize];
//循环队列的长度为MaxSize
int front,rear;
//设置队列的头指针和尾指针
}SqQueue;
//循环队列的结构体定义
在本次实验中,首先建立一个空队列,进入主程序后首先初始化队列为其分配空间,然后进入菜单选择界面,通过不同的数字输入,实现入队,出队,显示队列的所有元素,队列的长度,释放队列等操作。
(2)存储结构定义及算法思想
在队列结构体的定义中,typedef int Typeelem 为整型,存储(入队)结构如下:
q->rear=(q->rear+1)%Maxqsize;
//尾指针加1
q->elem[q->rear]=a;
//将入队元素装到新的空尾部
在此队列的存储结构的实现:先让队尾指针进1,再将新的元素加入到队尾指针所指示的位置,因此,队尾指针指示实际的队尾位置,队头指针指示实际队头的前一位置,要想退出队头元素,必须先让队头指针进1,才能取出队头元素。
退队函数模块如下:
void deQueue(SqQueue *&q){
//对指针的引用
if(QueueEmpty(q))
{
//调用带返回值的判断空队函数
cout<<“队列为空”<//判断队列是否为空
}
q->front=(q->front+1)%Maxqsize;
//队头指针进1
cout<<“退队的元素为:”<elem[q->front]<//取出队头元素 }
遍历队表函数:
void displayqueue(SqQueue *q){
int m;m=q->front+1;
//队头元素进1,指向实际队头
if(QueueEmpty(q))
{
cout<<“队列为空”<//判断是够为空队
}
cout<<“所有队列元素为:”<while(q->rear+1>m){
cout<elem[m]<<“ ”;
//通过循环遍历所有元素
m++;
}
cout<循环队列的入队和退队分别是在队尾与队头跟别进行操作的,通过队头队尾指针的操作便可实现对队列的相关操作。
(3)实验结果与分析
③ 心得体会
本次上机是做栈与队列的操作,这次实验,我有意的用到了对指针的引用与指针实现子函数功能的调用,刚开始编译的时候也有错误,但是在慢慢的摸索中,也逐渐掌握了它们的用法,这次实验也让我熟练了对队列与栈存储结构的应用。
附录:
顺序表源代码: 栈:
#include using namespace std;#define MaxSize 5 typedef int ElemType;int e;typedef struct { ElemType data[MaxSize];int top;}SqStack;
void InitStack(SqStack * &s)
//建立一个空栈,即将栈顶指针指向-1即可 的引用 { s=(SqStack *)malloc(sizeof(SqStack));s->top=-1;}
void ClearStack(SqStack * &s)
//释放栈s占用的存储空间 { free(s);}
void StackLength(SqStack *s)
{ cout<<“栈的长度为:” <<(s->top +1)<int StackEmpty(SqStack *s){ return(s->top==-1);}
void Push(SqStack *&s){ if(s->top==MaxSize-1)
{
cout<<“栈满”<//
s=(SqStack *)realloc(s,sizeof(SqStack));} int a;
指针
cout<<“请输入入栈元素”<>a;s->top++;s->data[s->top]=a;}
void Pop(SqStack * &s){ if(s->top ==-1){
cout<<“栈是空栈,不能退栈”<return;} cout<<“退栈的元素为:”<data[s->top]<top--;}
void GetTop(SqStack * &s,ElemType &e){ if(s->top==-1){cout<<“空栈”<data[s->top];}
void DispStack(SqStack *s)
//从栈顶到栈底顺序显示所有元素 { int i;cout<<“栈的元素分别为:”<top;i>=0;i--){ cout<data[i]<<“ ”;} cout<cout<<“请选择功能”<cout<<“
入栈
1”<cout<<“
出栈
2”<cout<<“
读取栈顶元素
3”<cout<<“
显示栈所有元素
4”<cout<<“
栈的长度
5”<cout<<“
释放栈
6”<cin>>k;
switch(k)
{
case 1: Push(s);break;
case 2: Pop(s);break;
case 3: GetTop(s,e);cout<<“栈顶元素为: ”<case 4: DispStack(s);break;
case 5: StackLength(s);break;
case 6: ClearStack(s);break;
default :break;
} } }
队列:
#include using namespace std;#define Maxqsize 8 typedef int TypeElem;typedef struct {
TypeElem elem[Maxqsize];
int front,rear;}SqQueue;void InitQueue(SqQueue *&q){
q=(SqQueue *)malloc(sizeof(SqQueue));
q->front=q->rear=0;} void ClearQueue(SqQueue *&q){
free(q);exit(0);} void QueueLength(SqQueue *q){
cout<<“队列长度为:”<<(q->rear-q->front+Maxqsize)%Maxqsize<return(q->front==q->rear);
} void enQueue(SqQueue *&q){ int a;
if((q->rear+1)%Maxqsize==q->front)
{
cout<<“队列已满,无法插入”<}
cout<<“请输入插入元素”<cin>>a;
q->rear=(q->rear+1)%Maxqsize;
q->elem[q->rear]=a;} void deQueue(SqQueue *&q){
if(QueueEmpty(q))
{
cout<<“队列为空”<}
q->front=(q->front+1)%Maxqsize;
cout<<“退队的元素为:”<elem[q->front]<}
void displayqueue(SqQueue *q){
int m;m=q->front+1;
if(QueueEmpty(q))
{
cout<<“队列为空”<}
cout<<“所有队列元素为:”<while(q->rear+1>m)
{
cout<elem[m]<<“ ”;
m++;
}
cout<int k=0;
SqQueue *q;
InitQueue(q);
if(QueueEmpty(q))cout<<“队列为空”<while(1){
cout<<“请选择功能”<cout<<“
入队
cout<<”
出队
cout<<“
队列长度
cout<<”
显示队列元素
cout<<“
释放栈
cin>>k;
switch(k)
{
case 1: enQueue(q);break;
case 2: deQueue(q);break;
case 3: QueueLength(q);break;
case 4: displayqueue(q);break;
case 5: ClearQueue(q);break;
default :break;
} } }
1”<2“<4“<