栈和队列及其应用实验报告

数据结构实验报告
实验名称:栈和队列及其应用
班级:12级电气本2
学号:2012081227
姓名:赵雪磊
指导教师:梁海丽
日期:2013年9月23日
数学与信息技术学院
一、实验目的
1. 掌握栈和队列的概念。

2.掌握栈和队列的基本操作(插入、删除、取栈顶元素、出队、入队等)。

3.理解栈和队列的顺序、链式存储。

二、实验要求
利用顺序栈将任意一个给定的十进制数转换成二进制、八进制、十六进制数并输出。

三、算法描述
#include "stdafx.h"
#include "iomanip.h"
void D10to2_8_16(int i,char radix)
{
char m;
if(i>=radix)
D10to2_8_16(i/radix,radix);
if((m=i%radix+'0')>0x39)
m+=7;
cout << m;
}
void main(void)
{
int nDec;
cout << "请输入一个十进制正整数...\n" << "nDec=";
cin >> nDec;
cout << "转换为二进制是:";
D10to2_8_16(nDec,2);
cout << endl;
cout << "转换为八进制是:0";
D10to2_8_16(nDec,8); cout << endl;
cout << "转换为十六进制是:0x";
D10to2_8_16(nDec,16);
cout << endl;
}
四、程序清单
#include<iostream>
#include<malloc.h>
#define N 2 //可以控制进制转换
using namespace std;
typedef struct{
int *top;
int *base;
int stacksize;
}stack;
int initstack(stack &s)
{
s.base =(int *)malloc(100*sizeof(int)); s.top =s.base ;
s.stacksize =100;
return 1;
}
int push(stack &s,int e)
{
*s.top =e;
s.top ++;
return 1;
}
int pop(stack &s,int &e)
{
s.top --;
e=*s.top ;
return 1;
}
int getelem(stack s)
{
int e=0;
while(s.base !=s.top )
{
pop(s,e);
cout<<e<<" ";
}
return 1;
}
int creatstack(stack &s)
{
float e=0,m=1;
cout<<"输入0表示结束栈的初始化"<<endl; while(m!=0)//输入0表示结束栈的初始化
{
cin>>e;
if(e!=0)
push(s,e);
m=e;
}
return 1;
}
int convert() //利用栈转化进制函数
{
int n,m=1,e=0;
stack s;
initstack(s);
cout<<endl<<"输入你要转化的数,0表示结束"<<endl; while(m)
{
cin>>n;
m=n;
if(n!=0)
{
while(n)
{
push(s,n%N);
n=n/N;
}
while(s.top !=s.base )
{
pop(s,e);
cout<<e;
}
cout<<endl;
}
}
return 1;
}
void main()
{
stack s;
initstack(s);
creatstack(s);
getelem(s);
convert();
}
五、实验结果与分析
六、实验心得
在调试程序的过程中,感触颇多。

在我所编译的程序中,算得上是一个比较繁琐的程序。

若想程序完善,好多方面都需要考虑到。

但在每一段程序中,有一点疏忽就可能导致整个程序无法运行。

合集下载

栈和队列的实验报告

栈和队列的实验报告

栈和队列的实验报告栈和队列的实验报告引言:栈和队列是计算机科学中常用的数据结构,它们在算法设计和程序开发中起着重要的作用。

本实验旨在通过实际操作和观察,深入理解栈和队列的概念、特点以及它们在实际应用中的作用。

一、栈的实验1.1 栈的定义和特点栈是一种具有特殊操作约束的线性数据结构,它的特点是“先进后出”(Last-In-First-Out,LIFO)。

栈的操作包括入栈(push)和出栈(pop),入栈操作将元素放入栈顶,出栈操作将栈顶元素移除。

1.2 实验步骤在本次实验中,我们使用编程语言实现了一个栈的数据结构,并进行了以下实验步骤:1.2.1 创建一个空栈1.2.2 向栈中依次压入若干元素1.2.3 查看栈顶元素1.2.4 弹出栈顶元素1.2.5 再次查看栈顶元素1.3 实验结果通过实验,我们观察到栈的特点:最后入栈的元素最先出栈。

在实验步骤1.2.2中,我们依次压入了元素A、B和C,栈顶元素为C。

在实验步骤1.2.4中,我们弹出了栈顶元素C,此时栈顶元素变为B。

二、队列的实验2.1 队列的定义和特点队列是一种具有特殊操作约束的线性数据结构,它的特点是“先进先出”(First-In-First-Out,FIFO)。

队列的操作包括入队(enqueue)和出队(dequeue),入队操作将元素放入队尾,出队操作将队头元素移除。

2.2 实验步骤在本次实验中,我们使用编程语言实现了一个队列的数据结构,并进行了以下实验步骤:2.2.1 创建一个空队列2.2.2 向队列中依次插入若干元素2.2.3 查看队头元素2.2.4 删除队头元素2.2.5 再次查看队头元素2.3 实验结果通过实验,我们观察到队列的特点:最先入队的元素最先出队。

在实验步骤2.2.2中,我们依次插入了元素X、Y和Z,队头元素为X。

在实验步骤2.2.4中,我们删除了队头元素X,此时队头元素变为Y。

三、栈和队列的应用栈和队列在实际应用中有广泛的应用场景,下面简要介绍一些常见的应用:3.1 栈的应用3.1.1 表达式求值:通过栈可以实现对表达式的求值,如中缀表达式转换为后缀表达式,并计算结果。

数据结构栈和队列实验报告

数据结构栈和队列实验报告

数据结构栈和队列实验报告实验报告:数据结构栈和队列一、实验目的1.了解栈和队列的基本概念和特点;2.掌握栈和队列的基本操作;3.掌握使用栈和队列解决实际问题的方法。

二、实验内容1.栈的基本操作实现;2.队列的基本操作实现;3.使用栈和队列解决实际问题。

三、实验原理1.栈的定义和特点:栈是一种具有后进先出(LIFO)特性的线性数据结构,不同于线性表,栈只能在表尾进行插入和删除操作,称为入栈和出栈操作。

2.队列的定义和特点:队列是一种具有先进先出(FIFO)特性的线性数据结构,不同于线性表,队列在表头删除元素,在表尾插入元素,称为出队和入队操作。

3.栈的基本操作:a.初始化:建立一个空栈;b.入栈:将元素插入栈的表尾;c.出栈:删除栈表尾的元素,并返回该元素;d.取栈顶元素:返回栈表尾的元素,不删除。

4.队列的基本操作:a.初始化:建立一个空队列;b.入队:将元素插入队列的表尾;c.出队:删除队列表头的元素,并返回该元素;d.取队头元素:返回队列表头的元素,不删除。

四、实验步骤1.栈的实现:a.使用数组定义栈,设置栈的大小和栈顶指针;b.实现栈的初始化、入栈、出栈和取栈顶元素等操作。

2.队列的实现:a.使用数组定义队列,设置队列的大小、队头和队尾指针;b.实现队列的初始化、入队、出队和取队头元素等操作。

3.使用栈解决实际问题:a.以括号匹配问题为例,判断一个表达式中的括号是否匹配;b.使用栈来实现括号匹配,遍历表达式中的每个字符,遇到左括号入栈,遇到右括号时将栈顶元素出栈,并判断左右括号是否匹配。

4.使用队列解决实际问题:a.以模拟银行排队问题为例,实现一个简单的银行排队系统;b.使用队列来模拟银行排队过程,顾客到达银行时入队,处理完业务后出队,每个顾客的业务处理时间可以随机确定。

五、实验结果与分析1.栈和队列的基本操作实现:a.栈和队列的初始化、入栈/队、出栈/队以及取栈顶/队头元素等操作均能正常运行;b.栈和队列的时间复杂度均为O(1),操作效率很高。

栈和队列的应用实验报告

栈和队列的应用实验报告

栈和队列的应用(10003809389j)一实验目的使学生掌握栈的特点及其逻辑结构和物理结构的实现;使学生掌握队列的特点及其逻辑结构和物理结构的实现;使学生掌握链栈和顺序栈结构的插入、删除等基本运算的实现;使学生掌握链队列和顺序队列结构的插入、删除等基本运算的实现;使学生熟练运用栈结构解决常见实际应用问题;使学生熟练运用队列结构解决常见实际应用问题;二实验环境所需硬件环境为微机;所需软件环境为 Microsoft Visual C++ 6.0 ;三实验内容链栈:#include "LinkList0.c"/*详见实验1*/LinkList InitStack_Sl() {LinkList S;S=InitList_Sl();return S; }Status DestroyStack_Sl(LinkList S) {if(!S) return ERROR;/*链栈不存在*/DestroyList_Sl(S);return OK; }Status StackEmpty_Sl(LinkList S) {if(!S) return ERROR;/*链栈不存在*/if(S->next==NULL)return TRUE;elsereturn FALSE; }/*若链栈S存在,则当S非空时返回栈顶元素e */Status StackGetTop_Sl(LinkList S) {if(!S) return ERROR;/*链栈不存在*/if(S->next==NULL) return FALSE;/*栈空*/elsereturn (S->next->elem); }/*若链栈S存在,则当S非空时,删除栈顶元素并用e保存删除的栈顶元素*/ Status StackPop_Sl(LinkList S,ElemType *e) {if(!S) return ERROR;/*链栈不存在*/ListDelete_Sl(S,e);return OK; }/*若链栈S存在时,插入元素e为新的栈顶元素*/Status StackPush_Sl(LinkList S,ElemType e) {if(!S) return ERROR;/*链栈不存在*/ListInsert_Sl(S,e);return OK; }/*若链栈S存在,返回链栈中元素个数*/int StackLength_Sl(LinkList S) {if(!S) return ERROR;/*链栈不存在*/return ListLength_Sl(S); }/*若链栈S存在,遍历链栈S,对每个元素执行操作void(*operate)(ElemType*)*/Status StackTraverse_Sl(LinkList S,void(*operate)(ElemType*)) { if(!S) return ERROR;/*链栈不存在*/return(ListTraverse_Sl(S,operate)); }链队列#include "LinkList0.c"/*详见实验1*/typedef struct Qode{ElemType elem;struct Qode *next;} Qode,*Queue;typedef struct {Queue front;Queue rear;}Linkqueue, *LinkQueue;/*InitQueue_Sq()构造一个空的队列*/LinkQueue InitQueue_Sl() {LinkQueue Q;Q->front=Q->rear=(Queue)malloc(sizeof(Qode));if(!Q->front) return NULL;/*存储分配失败*/Q->front->next=NULL;return Q; }/*若队列Q存在,销毁链队列Q*/Status DestroyQueue_Sl(LinkQueue Q) {Queue p;if(!Q) return ERROR;/*链队列不存在*/do{ /*释放单向线性链表空间*/p=Q->front;Q->front=Q->front->next;free(p);}while(Q->front);return OK; }/*若链队列Q存在,则当Q为空时返回TRUE,否则返回FALSE*/Status QueueEmpty_Sl(LinkQueue Q) {if(!Q) return ERROR;/*链队列不存在*/if(Q->front==Q->rear)return TRUE;elsereturn FALSE; }/*若链队列Q存在,则当Q非空时,返回队头元素e */Status QueueGetTop_Sl(LinkQueue Q,ElemType e) {if(!Q) return ERROR;/*链队列不存在*/if(QueueEmpty_Sl(Q)==TRUE) return FALSE;/*队列空*/else return (Q->front->next->elem); }/*若链队列Q存在,则当Q非空时,删除队头元素并用e保存删除的队头元素*/ Status DeQueue_Sl(LinkQueue Q,ElemType *e) {Queue p;if(!Q) return ERROR;/*顺序队列不存在*/if(QueueEmpty_Sl(Q)==TRUE) return FALSE;/*队列空*/else{p=Q->front->next;*e=p->elem;Q->front->next=p->next;if(Q->front->next==NULL) Q->rear=Q->front;free(p);return OK; } }/*若链队列Q存在时,插入元素e为新的队头元素*/ Status EnQueue_Sl(LinkQueue Q,ElemType e) {Queue p;if(!Q) return ERROR;/*单向线性链表结点L不存在*/ p=(Queue)malloc(sizeof(Qode));if(!p) exit(OVERFLOW); /*存储空间增加失败*/p->next=NULL;p->elem=e;Q->rear->next=p;Q->rear=p;return OK; }/*若链队列Q存在,返回链队列元素个数*/int QueueLength_Sl(LinkQueue Q) {int i=0;Queue p;if(!Q) return ERROR;/*链队列不存在*/p=Q->front;while(p!=Q->rear){ i++;p=p->next; }return (i); }/*若链队列Q存在,遍历链队列Q,对每个元素执行操作void(*operate)(ElemType*)*/ Status QueueTraverse_Sl(LinkQueue Q,void(*operate)(ElemType*)) {Queue p;if(!Q) return ERROR;/*链队列不存在*/p=Q->front->next;while(p!=NULL){ operate(&p->elem);p=p->next; }return(OK); }表达式求解#include "LinkStack.c"//用链栈实现中缀表达式求解。

数据结构_实验三_栈和队列及其应用(可编辑

数据结构_实验三_栈和队列及其应用(可编辑

数据结构_实验三_栈和队列及其应用(可编辑实验三:栈和队列及其应用1.实验目的:1.1掌握栈和队列的定义与基本操作。

1.2理解栈和队列的应用场景。

1.3熟悉栈和队列在计算机程序设计中的应用。

2.实验内容:2.1实现栈数据结构的基本操作:初始化、入栈、出栈、判断栈空、判断栈满、获取栈顶元素。

2.2实现队列数据结构的基本操作:初始化、入队、出队、判断队空、判断队满、获取队头元素。

2.3利用栈实现表达式求值。

2.4 利用队列解决Josephus问题。

3.实验步骤:3.1栈的实现:栈(Stack)是一种后进先出(LIFO)的数据结构,只能在一端进行插入和删除操作。

栈的实现可以使用数组或链表,这里以数组为例。

1)初始化栈:创建一个数组,设定一个栈指针top,初始时top值为-12)入栈操作:栈不满时,将元素插入到数组的top+1位置,然后top值加13)出栈操作:栈不空时,将数组的top位置的元素删除,然后top 值减14)判断栈空:当栈指针top为-1时,表示栈空。

5)判断栈满:当栈指针top达到数组的最大索引值时,表示栈满。

6)获取栈顶元素:栈不空时,返回数组的top位置的元素。

3.2队列的实现:队列(Queue)是一种先进先出(FIFO)的数据结构,插入操作在队尾进行,删除操作在队头进行。

队列的实现可以使用数组或链表,这里以数组为例。

1)初始化队列:创建一个数组,设定两个指针front和rear,初始时front和rear值均为-12)入队操作:队列不满时,将元素插入到数组的rear+1位置,然后rear值加13)出队操作:队列不空时,将数组的front+1位置的元素删除,然后front值加14)判断队空:当front和rear指针相等且都为-1时,表示队空。

5)判断队满:当rear指针达到数组的最大索引值时,表示队满。

6)获取队头元素:队列不空时,返回数组的front+1位置的元素。

3.3表达式求值:使用栈可以实现对表达式的求值。

实验三栈和队列的应用

实验三栈和队列的应用

实验三栈和队列的应用第一篇:实验三栈和队列的应用一、实验目的掌握栈的数据类型描述及栈的特点;掌握栈的顺序存储结构的特点及算法描述;掌握队列的数据类型描述及链式存储结构的特点和算法描述。

二、实验内容停车场管理。

设有一个可以停放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 intStackSize=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;}elsewhile(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)掌握栈的基本操作的实现方法。

数据结构实验-线性表及其实现栈和队列及其应用

数据结构实验-线性表及其实现栈和队列及其应用

数据结构实验报告一实验名称:线性表及其实现栈和队列及其应用1 实验目的及实验要求1.线性表目的要求:(1)熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现,以线性表的各种操作(建立、插入、删除等)的实现为实验重点;(2)通过本次实验帮助学生加深对顺序表、链表的理解,并加以应用;(3)掌握循环链表和双链表的定义和构造方法2.栈和队列目的要求:(1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们;(2)本实验训练的要点是“栈”的观点及其典型用法;(3)掌握问题求解的状态表示及其递归算法,以及由递归程序到非递归程序的转化方法。

2实验内容及实验步骤(附运行结果截屏)1.线性表实验内容:(1)编程实现线性表两种存储结构(顺序存储、链式存储)中的基本操作的实现(线性表的创建、插入、删除和查找等),并设计一个菜单调用线性表的基本操作。

(2)建立一个按元素递增有序的单链表L,并编写程序实现:a)将x插入其中后仍保持L的有序性;b)将数据值介于min和max之间的结点删除,并保持L的有序性;c)(选做)将单链表L逆置并输出;(3)编程实现将两个按元素递增有序的单链表合并为一个新的按元素递增的单链表。

注:(1)为必做题,(2)~(3)选做。

2.栈和队列实验内容:(1)编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等);(2)应用栈的基本操作,实现数制转换(任意进制);(3)编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);(4)利用栈实现任一个表达式中的语法检查(括号的匹配)。

(5)利用栈实现表达式的求值。

注:(1)~(2)必做,(3)~(5)选做。

实验步骤:先编写线性表和栈和队列的类模板,实现各自的基础结构,之后按照要求编写适当的函数方法(公共接口),最后完成封装。

编写主函数直接调用即可。

核心代码://LinearList.h 顺序表//类的声明1.template<class T>2.class LinearList3.{4.public:5.LinearList(int sz = default_size);6.~LinearList();7.int Length()const; //length of the linear8.int Search(T x)const; //search x in the linear and return its order number9.T GetData(int i)const; //get i th order's data10.bool SetData(int i,T x); //change i th order's data to x11.bool DeleteData(int i);12.bool InsertData(int i,T x);13.void output(bool a,int b,int c); //print the linear14.void ReSize(int new_size);15.16.private:17.T *data;18.int max_size,last_data;19.};//构造函数1.template<class T>2.LinearList<T>::LinearList(int sz)3.{4.if(sz>0)5.{6.max_size = sz;st_data=-1;8.data=new T[max_size];9.if(data == NULL)10.{11.cerr<<"Memory creat error!"<<endl;12.exit(1);13.}14.}15.else16.{17.cerr<<"Size error!"<<endl;18.exit(1);19.}20.}//Qlist.h 链式表//模板类的声明1.template<class T>2.struct LinkNode3.{4.T data;5.LinkNode<T> *link;6.LinkNode(LinkNode<T> *ptr = NULL)7.{8.link = ptr;9.}10.LinkNode(const T item,LinkNode<T> *ptr = NULL)11.{12.data = item;13.link = ptr;14.}15.};16.17.template<class T>18.class Qlist: public LinkNode<T>19.{20.public:21.Qlist();22.Qlist(const T x);23.Qlist(Qlist<T>&L);24.~Qlist();25.void MakeEmpty();26.int Length()const; //length of the linear27.int Search(T x)const; //search x in the linear and return its order number28.LinkNode<T> *Locate(int i);29.T GetData(int i); //get i th order's data30.bool SetData(int i,T x); //change i th order's data to x31.bool DeleteData(int i);32.bool InsertData(int i,T x);33.void output(bool a,int b,int c); //print the linear34.35.protected:36.LinkNode<T> *first;37.};//构造函数1.template<class T>2.Qlist<T>::Qlist(Qlist<T>&L)3.{4.T value;5.LinkNode<T>*src = L.getHead();6.LinkNode<T>*des = first = new LinkNode<T>;7.while(src->link != NULL)8.{9.value = src->link->data;10.des->link = new LinkNode<T>(value);11.des = des->link;12.src = src->link;13.}14.des->link = NULL;15.}截屏:3 实验体会(实验遇到的问题及解决方法)刚开始的时候本想先写线性表的类模板然后分别进行继承写顺序表和链式表甚至是以后的栈和队列。

实验报告——栈和队列的应用

实验报告——栈和队列的应用第一篇:实验报告——栈和队列的应用实验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<cin>>flag;continue;//为空跳出for循环为下次输入命令做好准备}q.carry_out();//调用执行命令的函数,将命令打印并删除}三、程序调试过程中所出现的错误无。

栈和队列实验报告

数据结构实验报告顺序栈的实现和基本操作一、需求分析(1)顺序栈♦栈的典型操作是入栈和出栈,前者将新元素压入栈中,后者弹出栈顶元素。

栈只提供对栈顶元素的访问操作,由top ( )完成。

Push ( ) 和Pop ( )还有Top ( )共同构成了栈的最小功能接口。

此外,为了方便使用,栈还有判空,判满和输出栈等功能。

♦输入形式及范围:输入形式为整型,范围为0~65535。

♦输出形式:在顺序栈的初始化后显示初始化成功,在判断栈是否为空时显示当前栈为空,入栈后显示入栈成功或者栈已满。

出栈时显示出栈元素或者栈为空。

输出栈时依次显示栈中元素。

♦程序功能:初始化栈,判断栈是否为空,判断栈是否为满,入栈,出栈,取栈顶元素,出栈同时返回栈顶元素和输出栈等功能。

♦测试数据:初始化后输入栈的长度为4。

判断栈是否为空。

进行5次入栈操作。

分别输入1 2 3 4 5输出栈。

执行2次出栈操作。

输出栈。

查看栈顶元素。

输出栈。

(2)队列♦队列的典型操作是入队和出队,前者将新元素压入队列中,后者弹出队首头元素。

队列只提供对队头元素和队尾元素的操作,由DeQueue ()和EnQueue(完成。

DeQueue还有EnQueue ()共同构成了队列的最小功能接口。

此外,为了方便使用,队列还有判空,判满和输出队列等功能。

♦输入形式及范围:输入形式为整型,范围为0~65535。

♦输出形式:在顺序队列的初始化后显示初始化成功,在判断队列是否为空时显示当前队列为空,入队列后显示入队成功或者队列已满。

出队列时显示出队首元素或者队列为空。

输出队列时依次显示队列中元素。

♦程序功能:初始化队列,判断队列是否为空,判断队列是否为满,入队,出队,取队首元素,输出队列等功能。

♦测试数据:初始化后输入队列的长度为54。

判断队列是否为空。

进行5次入队操作。

分别输入1 2 3 4 5输出队列。

执行2次出队操作。

输出队列。

查看队首元素二、概要设计(1)顺序栈♦为了实现程序的功能,在.H文件中定义了栈的模板类.template <class T>class Stack{私有数据成员:private:栈的最大长度int MaxSize;栈顶位置int top;顺序栈首地址T *theArray;公有成员:public:栈的初始化void InitStack(int capacity=10);操作结果:初始化一个默认长度为10 的空栈判断栈是否为空bool IsEmpty() const; 初始条件:栈已存在。

栈和队列的应用实验报告

栈和队列的应用实验报告栈和队列的应用实验报告引言:栈和队列是计算机科学中常用的数据结构,它们在各种算法和应用中都有广泛的应用。

本实验报告旨在探讨栈和队列的基本概念、特性以及它们在实际应用中的具体使用。

一、栈的基本概念和特性栈是一种特殊的数据结构,它遵循“先进后出”的原则。

栈有两个基本操作:压栈(push)和弹栈(pop)。

压栈将元素添加到栈的顶部,弹栈则将栈顶元素移除。

栈还具有一个重要的特性,即它的访问方式是受限的,只能访问栈顶元素。

在实际应用中,栈可以用于实现递归算法、表达式求值、括号匹配等。

例如,在递归算法中,当函数调用自身时,需要将当前状态保存到栈中,以便在递归结束后能够恢复到正确的状态。

另外,栈还可以用于实现浏览器的“后退”功能,每次浏览新页面时,将当前页面的URL压入栈中,当用户点击“后退”按钮时,再从栈中弹出最近访问的URL。

二、队列的基本概念和特性队列是另一种常见的数据结构,它遵循“先进先出”的原则。

队列有两个基本操作:入队(enqueue)和出队(dequeue)。

入队将元素添加到队列的尾部,出队则将队列头部的元素移除。

与栈不同的是,队列可以访问头部和尾部的元素。

在实际应用中,队列经常用于任务调度、消息传递等场景。

例如,在操作系统中,任务调度器使用队列来管理待执行的任务,每当一个任务执行完毕后,从队列中取出下一个任务进行执行。

另外,消息队列也是一种常见的应用,它用于在分布式系统中传递消息,保证消息的顺序性和可靠性。

三、栈和队列在实际应用中的具体使用1. 栈的应用栈在计算机科学中有广泛的应用。

其中一个典型的应用是表达式求值。

当计算机遇到一个复杂的表达式时,需要将其转化为逆波兰表达式,然后使用栈来进行求值。

栈的特性使得它非常适合处理这种情况,可以方便地保存运算符和操作数的顺序,并按照正确的顺序进行计算。

另一个常见的应用是括号匹配。

在编程语言中,括号是一种常见的语法结构,需要保证括号的匹配性。

数据结构_实验三_栈和队列及其应用

数据结构_实验三_栈和队列及其应用实验编号:3 四川师大《数据结构》实验报告 2016年10月29日实验三栈和队列及其应用_一(实验目的及要求(1) 掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们;(2) 本实验训练的要点是“栈”的观点及其典型用法;(3) 掌握问题求解的状态表示及其递归算法,以及由递归程序到非递归程序的转化方法。

二(实验内容(1) 编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等);(2) 应用栈的基本操作,实现数制转换(任意进制);(3) 编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);(4) 利用栈实现任一个表达式中的语法检查(括号的匹配)。

(5) 利用栈实现表达式的求值。

注:(1),(3)必做,(4),(5)选做。

三(主要仪器设备及软件(1) PC机(2) Dev C++ ,Visual C++, VS2010等四(实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页)(1) 编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等);A.顺序储存:, 代码部分://Main.cpp:#include"SStack.h"int main(){SqStack S;SElemType e;int elect=1;InitStack(S);cout << "已经创建一个存放字符型的栈" << endl;while (elect){Muse();cin >> elect;cout << endl;switch (elect){case 1:cout << "input data:";cin >> e;Push(S, e);break;case 2:if(Pop(S, e)){cout << e <<" is pop"<< endl; } else{cout<<"blank"<<endl;} break;case 3:if (StackEmpty(S)){cout << "栈空 " << endl;}else{cout << "栈未空 " << endl;}break;case 4:GetTop(S, e);cout << "e is " << e << endl;break;case 5:StackLength(S);break;case 0:break;}}DestroyStack(S);return OK;}//SStack.cpp:#include"SStack.h"//输出菜单void Muse(){cout << "请选择功能:" << endl;cout << " 1.入栈" << endl;cout << " 2.出栈" << endl;cout << " 3.判栈空" << endl;cout << " 4.返回栈顶部数据" << endl; cout << " 5.栈长" << endl;cout << " 0.退出系统" << endl;cout << "你的选择是:" ;}//创建栈Status InitStack(SqStack &S) {S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if (!S.base) exit(ERROR);S.top = S.base;S.stacksize = STACK_INIT_SIZE;return OK;}//得到顶部数据Status GetTop(SqStack S, SElemType &e) {if (S.base == S.top) return ERROR;e = *(S.top - 1);return OK;}//入栈Status Push(SqStack &S, SElemType &e) {if (S.top - S.base >= STACK_INIT_SIZE){S.base = (SElemType *)realloc(S.base, (STACK_INIT_SIZE + STACKINCREMENT) * sizeof(SElemType));if (!S.base) exit(ERROR);S.top = S.base + S.stacksize;S.stacksize += STACKINCREMENT;}*S.top++ = e;return OK;}//出栈Status Pop(SqStack &S, SElemType &e) { if (S.base == S.top){return ERROR;}e = *--S.top;cout<<"pop succeed"<<endl;return OK;}//判栈空Status StackEmpty(SqStack S) {if (S.top == S.base){return ERROR;}return OK;}//销毁栈Status DestroyStack(SqStack &S){free(S.base);S.top=NULL;S.stacksize = 0;cout << "栈已销毁" << endl;return OK;}int StackLength(SqStack S) {cout << "StackLength is "<<S.top-S.base << endl;return OK;}//SStack.h:#include<iostream> #include<stdlib.h> using namespace std;const int STACK_INIT_SIZE = 100;const int STACKINCREMENT = 10;const int ERROR = 0; const int OK = 1;typedef char SElemType; typedef int Status; typedef struct {SElemType *base;SElemType *top;int stacksize;}SqStack;Status InitStack(SqStack &S);//创建顺序存储的栈 StatusGetTop(SqStack S, SElemType &e);//得到栈顶数据 Status Push(SqStack &S, SElemType &e);//入栈 Status Pop(SqStack &S, SElemType &e);//出栈 void Muse();//输出菜单界面Status StackEmpty(SqStack S);//判断栈是否为空 StatusDestroyStack(SqStack &S);//销毁栈 int StackLength(SqStack S);//计算栈的长度, 运行结果:B. 链式储存:, 代码部分://Main.cpp#include"Lstack.h" int main(){Lq_Stack L;if(InintStack (L)){cout<<"build stack succeed"<<endl;}else exit (ERROR);int e=0;Menu(L,e);DestroyStack(L);return 0;}//Lstack.cpp#include"Lstack.h" Status InintStack(Lq_Stack &L){ //创建栈L=(LqStack *)malloc(sizeof(LqStack));if(!L) exit(ERROR);L->data=0;L->next=NULL;return OK;}Status push (Lq_Stack &L,SElemType e){//入栈LqStack *p;p=(LqStack *)malloc(sizeof(LqStack));if(!p) exit(ERROR);p->data=e;L->data++;p->next=L->next;L->next=p;return OK;}Status pop (Lq_Stack &L,SElemType &e){ //出栈LqStack *p;if(L->next==NULL) return ERROR;p=L->next;e=p->data;L->next=p->next;L->data--;free(p);return OK;}Status GetTop(Lq_Stack L, SElemType &e){ //得到栈顶数据if(L->next==NULL) return ERROR;e=L->next->data;return OK;}Status StackEmpty(Lq_Stack L){//判断栈是否为空if(L->next==NULL){return ERROR;}else return OK;}int StackLength(Lq_Stack L){//计算栈的长度return L->data;}Status DestroyStack(Lq_Stack &L){//销毁栈LqStack *p;while(!L){L=p;L=L->next;free(p);}return OK;}void Menu(Lq_Stack &L,SElemType e){//输出菜单选择执行的功能int select=1;while(select){cout<<"————————————"<<endl; cout<<"请选择功能"<<endl;cout<<"——————1.入栈"<<endl;cout<<"——————2.出栈"<<endl;cout<<"——————3.得到顶部数据"<<endl;cout<<"——————4.判断栈是否为空"<<endl; cout<<"——————5.输出栈的长度"<<endl; cout<<"——————0.退出程序"<<endl;cout<<"你的选择是:";cin>>select;switch (select){case 0:break;case 1:cout<<"push data:";cin>>e;if(push(L,e)){cout<<"push succeed"<<endl;}else cout<<"push failed"<<endl;break;case 2:if(pop(L,e)){cout<<"data "<<e<<" is pop"<<endl;}else cout<<"pop failed"<<endl;break;case 3:if(GetTop(L,e)){cout<<"head data "<<e<<" is pop"<<endl;} else cout<<"Get failed"<<endl;break;case 4:if(StackEmpty(L)){cout<<"stack is not NULL"<<endl;}else cout<<"stack is NULL"<<endl;break;case 5:cout<<"this stack length is "<<StackLength(L)<<endl;break;}}}//Lstack.h#include<iostream>#include<stdlib.h>using namespace std; const int OK=1;const int ERROR=0;typedef int SElemType; typedef int Status; typedef struct LqStack{ SElemType data;struct LqStack *next; }LqStack,*Lq_Stack;Status InintStack (Lq_Stack &L);//创建栈Status push (Lq_Stack &L,SElemType e);//入栈 Status pop (Lq_Stack&L,SElemType &e);//出栈 Status GetTop(Lq_Stack L, SElemType &e);//得到栈顶数据 Status StackEmpty(Lq_Stack L);//判断栈是否为空int StackLength(Lq_Stack L);//计算栈的长度Status DestroyStack(Lq_Stack &L);//销毁栈void Menu(Lq_Stack &L,SElemType e);//输出菜单选择执行的功能, 运行结果:(2) 应用栈的基本操作,实现数制转换(任意进制);; , 代码部分: //Main.cpp#include"SStack.h"int main(){int number;cout<<"要将数值转换为多少进制 ";cin>>number;conversion(number);return 0;}SStack.cpp#include"SStack.h"Status InitStack(SStack &S){//创建栈S.dase=(ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if (!S.dase) exit(ERROR);S.top=S.dase;S.stacksize=STACK_INIT_SIZE;return OK;}Status push(SStack &S,ElemType e){//入栈if(S.top-S.dase >= S.stacksize){//栈满追加空间S.dase=(ElemType *)realloc(S.dase,(STACK_INIT_SIZE+STACKINCREMENT) * sizeof(ElemType));if(!S.dase) exit(ERROR);S.top=S.dase+STACK_INIT_SIZE;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}Status pop(SStack &S,ElemType &e){//出栈if(S.top== S.dase) return ERROR; e=*--S.top;return OK;}Status StackEmpty(SStack &S){//判断栈是否为空if(S.dase==S.top) return ERROR; return OK;}void conversion(int number){//转换为e进制并输出SStack S;int N,e;if(InitStack(S)){cout<<"栈创建成功"<<endl;}cout<<"输入待转换的数:";cin>>N;while(N){push(S,N%number);N=N/number;}while(StackEmpty(S)){pop(S,e);cout<<e;}cout<<endl;}//SStack.h#ifndef SSTACK_H#define SSTACK_H#include<iostream> #include<stdlib.h> using namespace std;const int STACK_INIT_SIZE=100;const int STACKINCREMENT=10;const int OK=1;const int ERROR=0;typedef int Status; typedef int ElemType; typedef struct {ElemType *dase;ElemType *top;int stacksize;}SStack;Status InitStack(SStack &S);//创建栈Status push(SStack &S,ElemType e);//入栈 Status push(SStack&S,ElemType &e);//出栈 Status StackEmpty(SStack &S);//判断栈是否为空void conversion(int number);//转换为number进制并输出#endif, 运行结果:(3) 编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档