栈和队列及其应用实验报告
栈和队列的实验报告
栈和队列的实验报告栈和队列的实验报告引言:栈和队列是计算机科学中常用的数据结构,它们在算法设计和程序开发中起着重要的作用。
本实验旨在通过实际操作和观察,深入理解栈和队列的概念、特点以及它们在实际应用中的作用。
一、栈的实验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) 编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列)。
数据结构栈和队列实验报告
数据结构栈和队列实验报告一、实验目的本次实验的主要目的是深入理解和掌握数据结构中的栈和队列的基本概念、操作原理以及实际应用。
通过编程实现栈和队列的相关操作,加深对其特性的认识,并能够运用栈和队列解决实际问题。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、实验原理(一)栈栈(Stack)是一种特殊的线性表,其操作遵循“后进先出”(Last In First Out,LIFO)的原则。
可以将栈想象成一个只有一端开口的容器,元素只能从开口端进出。
入栈操作(Push)将元素添加到栈顶,出栈操作(Pop)则从栈顶移除元素。
(二)队列队列(Queue)也是一种线性表,但其操作遵循“先进先出”(FirstIn First Out,FIFO)的原则。
队列就像是排队买票的队伍,先到的人先接受服务。
入队操作(Enqueue)将元素添加到队列的末尾,出队操作(Dequeue)则从队列的头部移除元素。
四、实验内容(一)栈的实现与操作1、定义一个栈的数据结构,包含栈顶指针、存储元素的数组以及栈的最大容量等成员变量。
2、实现入栈(Push)操作,当栈未满时,将元素添加到栈顶,并更新栈顶指针。
3、实现出栈(Pop)操作,当栈不为空时,取出栈顶元素,并更新栈顶指针。
4、实现获取栈顶元素(Top)操作,返回栈顶元素但不进行出栈操作。
5、实现判断栈是否为空(IsEmpty)和判断栈是否已满(IsFull)的操作。
(二)队列的实现与操作1、定义一个队列的数据结构,包含队头指针、队尾指针、存储元素的数组以及队列的最大容量等成员变量。
2、实现入队(Enqueue)操作,当队列未满时,将元素添加到队尾,并更新队尾指针。
3、实现出队(Dequeue)操作,当队列不为空时,取出队头元素,并更新队头指针。
4、实现获取队头元素(Front)操作,返回队头元素但不进行出队操作。
5、实现判断队列是否为空(IsEmpty)和判断队列是否已满(IsFull)的操作。
数据结构_实验三_栈和队列及其应用
}
//SStack、h:
#include<iostream>
#include<stdlib、h>
using namespace std;
const int STACK_INIT_SIZE = 100;
const int STACKINCREMENT = 10;
const int ERROR = 0;
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;
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)
二.实验内容
(1)编程实现栈在两种存储结构中的基本操作(栈的初始化、判栈空、入栈、出栈等);
(2)应用栈的基本操作,实现数制转换(任意进制);
(3)编程实现队列在两种存储结构中的基本操作(队列的初始化、判队列空、入队列、出队列);
栈和队列实验报告
栈和队列实验报告引言:计算机科学中的数据结构是解决问题的关键。
栈和队列这两种常用的数据结构,无疑在许多实际应用中起着重要的作用。
本篇报告旨在探讨栈和队列的实验结果,并展示它们的实际应用。
一、栈的实验结果及应用1. 栈的实验结果在实验中,我们设计了一个基于栈的简单计算器,用于实现基本的四则运算。
通过栈的先进后出(Last In First Out)特性,我们成功实现了表达式的逆波兰表示法,并进行了正确的计算。
实验结果表明,栈作为一个非常有效的数据结构,可以很好地处理栈内数据的存储和检索。
2. 栈的应用栈在计算机科学中有许多实际应用。
其中之一是程序调用的存储方式。
在程序调用过程中,每个函数的返回地址都可以通过栈来保存和恢复。
另一个应用是浏览器的历史记录。
浏览器中每个访问网页的URL都可以通过栈来存储,以便用户能够追溯他们之前访问的网页。
二、队列的实验结果及应用1. 队列的实验结果在实验中,我们模拟了一个简单的出租车调度系统,利用队列的先进先出(First In First Out)特性实现乘客的排队和叫车。
实验结果表明,队列作为一个具有高效性和可靠性的数据结构,能够很好地处理排队问题。
2. 队列的应用队列在许多方面都有应用。
一个常见的应用是消息队列。
在网络通信中,消息队列可以用于存储和传递信息,确保按照特定的顺序进行处理。
另一个应用是操作系统的进程调度。
操作系统使用队列来管理各个进程的执行顺序,以实现公平和高效的资源分配。
三、栈和队列的比较及选择1. 效率比较栈和队列在实际应用中的效率取决于具体问题的需求。
栈的操作更简单,仅涉及栈顶元素的插入和删除,因此具有更高的执行速度。
而队列涉及到队头和队尾元素的操作,稍复杂一些。
但是,队列在某些问题中的应用更为广泛,例如调度问题和消息传递问题。
2. 如何选择在选择栈和队列时,需要根据实际问题的性质和需求进行综合考虑。
如果问题需要追溯历史记录或按照特定顺序进行处理,则应选择栈作为数据结构。
数据结构栈的实验报告
数据结构栈的实验报告篇一:数据结构栈和队列实验报告一、实验目的和要求(1)理解栈和队列的特征以及它们之间的差异,知道在何时使用那种数据结构。
(2)重点掌握在顺序栈上和链栈上实现栈的基本运算算法,注意栈满和栈空的条件。
(3)重点掌握在顺序队上和链队上实现队列的基本运算算法,注意循环队队列满和队空的条件。
(4)灵活运用栈和队列这两种数据结构解决一些综合应用问题。
二、实验环境和方法实验方法:(一)综合运用课本所学的知识,用不同的算法实现在不同的程序功能。
(二)结合指导老师的指导,解决程序中的问题,正确解决实际中存在的异常情况,逐步改善功能。
(三)根据实验内容,编译程序。
实验环境:Windows xpVisual C++6.0三、实验内容及过程描述实验步骤:①进入Visual C++ 6.0集成环境。
②输入自己编好的程序。
③检查一遍已输入的程序是否有错(包括输入时输错的和编程中的错误),如发现有错,及时改正。
④进行编译和连接。
如果在编译和连接过程中发现错误,频幕上会出现“报错信息”,根据提示找到出错位置和原因,加以改正。
再进行编译,如此反复直到不出错为止。
⑤运行程序并分析运行结果是否合理。
在运行是要注意当输入不同的数据时所得结果是否正确,应运行多次,分别检查在不同情况下结果是否正确。
实验内容:编译以下题目的程序并调试运行。
1)、编写一个程序algo3-1.cpp,实现顺的各种基本运算,并在此基础上设计一程序并完成如下功能:(1)初始化栈s;(2)判断栈s是否非空;序栈个主(3)依次进栈元素a,b,c,d,e;(4)判断栈s是否非空;(5)输出出栈序列;(6)判断栈s是否非空;(7)释放栈。
图3.1 Proj3_1 工程组成本工程Proj3_1的组成结构如图3.1所示。
本工程的模块结构如图3.2所示。
图中方框表示函数,方框中指出函数名,箭头方向表示函数间的调用关系。
图3.2 Proj3_1工程的程序结构图其中包含如下函数:InitStack(SqStack * s) //初始化栈SDestroyStack(SqStack * s) //销毁栈sStackEmpty(SqStack *s) //判断栈空Push(SqStack * s,ElemType e) //进栈Pop(SqStack * s,ElemType e) //出栈GetTop(SqStack *s,ElemType e) //取栈顶元素对应的程序如下://文件名:algo3-1.cpp#include stdio.h#include malloc.h#define MaxSize 100typedef char ElemType;typedef struct{ElemType data[MaxSize];int top; //栈顶指针} SqStack;void InitStack(SqStack * s) //初始化栈S { s=(SqStack *)malloc(sizeof(SqStack));s- top=-1; //栈顶指针置为-1}void DestroyStack(SqStack * s) //销毁栈s{free(s);}bool StackEmpty(SqStack *s) //判断栈空{return(s- top==-1);}bool Push(SqStack * s,ElemType e) //进栈{ if (s- top==MaxSize-1) //栈满的情况,即栈上溢出 return false;s- top++; //栈顶指针增1s- data[s- top]=e; //元素e放在栈顶指针处return true;}bool Pop(SqStack * s,ElemType e) //出栈{ if (s- top==-1) //栈为空的情况,即栈下溢出return false;e=s- data[s- top]; //取栈顶指针元素的元素s- top--;//栈顶指针减1return true;}bool GetTop(SqStack *s,ElemType e) //取栈顶元素 { if (s- top==-1) //栈为空的情况,即栈下溢出return false;e=s- data[s- top]; //取栈顶指针元素的元素return true;}设计exp3-1.cpp程序如下 //文件名:exp3-1.cpp#include stdio.h#include malloc.h#define MaxSize 100typedef char ElemType;typedef struct{ElemType data[MaxSize];int top; //栈顶指针} SqStack;extern void InitStack(SqStack *extern void DestroyStack(SqStack *extern bool StackEmpty(SqStack *s);extern bool Push(SqStack * s,ElemType e);extern bool Pop(SqStack * s,ElemTypeextern bool GetTop(SqStack *s,ElemTypevoid main(){ElemType e;SqStack *s;printf( 栈s的基本运算如下:\nprintf( (1)初始化栈s\nInitStack(s);printf( (2)栈为%s\n ,(StackEmpty(s)? 空 : 非空 )); printf( (3)依次进栈元素a,b,c,d,e\nPush(s, aPush(s, bPush(s, cPush(s, dPush(s, eprintf( (4)栈为%s\n ,(StackEmpty(s)? 空 : 非空 )); printf( (5)出栈序列:while (!StackEmpty(s)){Pop(s,e);printf( %c ,e);}printf( \nprintf( (6)栈为%s\n ,(StackEmpty(s)? 空 : 非空 ));printf( (7)释放栈\nDestroyStack(s);}运行结果如下:2)、编写一个程序algo3-2.cpp,实现链栈的各种基本运算,并在此基础上设计一个主程序并完成如下功能:(1)初始化链栈s;(2)判断链栈s是否非空;(3)依次进栈a,b,c,d,e;(4)判断链栈s是否非空;(5)输出链栈长度;(6)输出从栈底到栈顶元素;(7)输出出队序列;(8)判断链栈s是否非空;图3.3 Proj3_2工程组成(9)释放队列。
栈队列及其应用实验报告
一、实验目的1. 理解栈和队列的基本概念、特点及逻辑结构。
2. 掌握栈和队列的存储结构,包括顺序存储结构和链式存储结构。
3. 熟练掌握栈和队列的基本操作,如入栈、出栈、入队、出队等。
4. 分析栈和队列在实际问题中的应用,提高解决实际问题的能力。
二、实验内容1. 栈和队列的定义及特点2. 栈和队列的存储结构3. 栈和队列的基本操作4. 栈和队列的实际应用案例分析三、实验过程1. 栈和队列的定义及特点栈(Stack)是一种后进先出(Last In First Out,LIFO)的数据结构,它只允许在一端进行插入和删除操作。
栈的典型应用场景有函数调用、递归算法等。
队列(Queue)是一种先进先出(First In First Out,FIFO)的数据结构,它允许在两端进行插入和删除操作。
队列的典型应用场景有打印队列、任务队列等。
2. 栈和队列的存储结构(1)顺序存储结构栈和队列的顺序存储结构使用数组来实现。
对于栈,通常使用数组的一端作为栈顶,入栈操作在栈顶进行,出栈操作也在栈顶进行。
对于队列,通常使用数组的一端作为队首,入队操作在队尾进行,出队操作在队首进行。
(2)链式存储结构栈和队列的链式存储结构使用链表来实现。
对于栈,每个元素节点包含数据和指向下一个节点的指针。
入栈操作在链表头部进行,出栈操作在链表头部进行。
对于队列,每个元素节点包含数据和指向下一个节点的指针。
入队操作在链表尾部进行,出队操作在链表头部进行。
3. 栈和队列的基本操作(1)栈的基本操作- 入栈(push):将元素添加到栈顶。
- 出栈(pop):从栈顶删除元素。
- 获取栈顶元素(peek):获取栈顶元素,但不删除它。
- 判断栈空(isEmpty):判断栈是否为空。
(2)队列的基本操作- 入队(enqueue):将元素添加到队列尾部。
- 出队(dequeue):从队列头部删除元素。
- 获取队首元素(peek):获取队首元素,但不删除它。
数据结构栈和队列的基本操作及应用实验报告
实验日期2010.4.26 教师签字成绩实验报告【实验名称】第三章栈和队列的基本操作及应用【实验目的】(1)熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等,掌握栈的基本操作在栈的顺序存储结构和链式存储结构上的实现;(2)熟悉队列的特点(先进先出)及队列的基本操作,如入队、出队等,掌握队列的基本操作在队列的顺序存储结构和链式存储结构上的实现。
【实验内容】1.链栈的基本操作(链栈的初始化、进栈、出栈以及取栈顶的值)#include "stdio.h"#include "malloc.h"#include "stdlib.h"typedef int Elemtype;typedef struct stacknode {Elemtype data;stacknode * next;}StackNode;typedef struct {stacknode * top; //栈顶指针}LinkStack;/*初始化链栈*/void InitStack(LinkStack * s){ s->top=NULL;printf("\n已经初始化链栈!\n");}/*链栈置空*/void setEmpty(LinkStack * s){ s->top=NULL;printf("\n链栈被置空!\n");}/*入栈*/void pushLstack(LinkStack * s, Elemtype x){ StackNode * p;p=(StackNode *)malloc(sizeof(StackNode)); //建立一个节点。
p->data=x;p->next=s->top; //由于是在栈顶pushLstack,所以要指向栈顶。
s->top=p; //插入}/*出栈*/Elemtype popLstack(LinkStack * s){ Elemtype x;StackNode * p;p=s->top; //指向栈顶if (s->top ==0){ printf("\n栈空,不能出栈!\n");exit(-1);}x=p->data;s->top=p->next; //当前的栈顶指向原栈的nextfree(p); //释放return x;}/*取栈顶元素*/Elemtype StackTop(LinkStack *s){ if (s->top ==0){ printf("\n链栈空\n");exit(-1);}return s->top->data;}/*遍历链栈*/void Disp(LinkStack * s){ printf("\n链栈中的数据为:\n");printf("=======================================\n");StackNode * p;p=s->top;while (p!=NULL){ printf("%d\n",p->data);p=p->next;}printf("=======================================\n");}void main(){ printf("================= 链栈操作=================\n\n");int i,m,n,a;LinkStack * s;s=(LinkStack *)malloc(sizeof(LinkStack));int cord;do{ printf("\n");printf("第一次使用必须初始化!\n");printf("\n");printf("\n 主菜单\n");printf("\n 1 初始化链栈\n");printf("\n 2 入栈\n");printf("\n 3 出栈\n");printf("\n 4 取栈顶元素\n");printf("\n 5 置空链栈\n");printf("\n 6 结束程序运行\n");printf("\n--------------------------------\n");printf("请输入您的选择( 1, 2, 3, 4, 5,6)");scanf("%d",&cord);printf("\n");switch(cord){ case 1:{ InitStack(s);Disp(s);}break;case 2:{printf("输入将要压入链栈的数据的个数:n=");scanf("%d",&n);printf("依次将%d个数据压入链栈:\n",n);for(i=1;i<=n;i++){scanf("%d",&a);pushLstack(s,a);}Disp(s);}break;case 3:{ printf("\n出栈操作开始!\n");printf("输入将要出栈的数据个数:m=");scanf("%d",&m);for(i=1;i<=m;i++){printf("\n第%d次出栈的数据是:%d",i,popLstack(s));}Disp(s);}break;case 4:{ printf("\n\n链栈的栈顶元素为:%d\n",StackTop(s));printf("\n");}break;case 5:{ setEmpty(s);Disp(s);}break;case 6:exit(0);}}while (cord<=6);}2.顺序栈的基本操作(顺序栈的初始化、进栈、出栈以及取栈顶的值)#include<stdio.h>#include<malloc.h>#include<stdlib.h>#define STACKSIZE 100#define STACKINCREMENT 10#define null 0typedef struct {int *base;int *top;int stacksize;}SqStack;SqStack Initstack(){SqStack S;S.base=(int *)malloc(STACKSIZE*sizeof(int));if(!S.base){printf("\n存储分配失败\n");exit(0);}S.top=S.base;S.stacksize=STACKSIZE;return S;}int StackEmpty(SqStack S){if(S.top==S.base) return 1;else return 0;}int StackLength(SqStack S){int *p;p=S.base;for(int i=0;p!=S.top;p++,i++);return i;}int GetTop(SqStack S){int e;if(StackEmpty(S)) {printf("当前栈为空,不能执行此操作\n");exit(0);}e=*(S.top-1);return e;}int Push(SqStack &S,int e){if(StackLength(S)>=S.stacksize){S.base=(int*)realloc(S.base,(STACKSIZE+STACKINCREMENT)*sizeof(int));if(!S.base){printf("\n再分配存储失败\n");return 0;}S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return 1;}int Pop(SqStack &S){int e;if(StackEmpty(S)){printf("当前栈为空,不能执行此操作\n");exit(0);}e=*--S.top;return e;}void main(){int i=0,e;int *p;SqStack S;S=Initstack();printf("\n 1.元素进栈\n 2.元素出栈\n 3.取栈顶元素\n 4.求栈的长度\n 5.判栈空\n 6.退出\n");for(;i!=6;){printf("\n请选择你要进行的操作:");scanf("%d",&i);switch(i){case 1:printf("\n请输入进栈元素:");scanf("%d",&e);Push(S,e);p=S.base;printf("\n当前栈中元素:");if(StackEmpty(S))printf("当前栈为空\n");while(p!=S.top){printf("%d ",*p);p++;}break;case 2:printf("\n%d已出栈\n",Pop(S));printf("\n当前栈中元素:");if(StackEmpty(S))printf("当前栈为空\n");p=S.base;while(p!=S.top){printf("%d ",*p);p++;}break;case 3:printf("\n栈顶元素为:%d\n",GetTop(S));break;case 4:printf("\n栈的长度为:%d\n",StackLength(S));break;case 5:if(StackEmpty(S))printf("\n当前栈为空\n");else printf("\n当前栈不空\n");break;default:printf("\n退出程序\n");}}}3.顺序队列的基本操作(顺序队的初始化、进队、出对以及取对头)#include <stdio.h>#include <malloc.h>#define MAXNUM 100#define Elemtype int#define TRUE 1#define FALSE 0typedef struct{ Elemtype queue[MAXNUM];int front;int rear;}sqqueue;/*队列初始化*/int initQueue(sqqueue *q){ if(!q) return FALSE;q->front=-1;q->rear=-1;return TRUE;}/*入队*/int append(sqqueue *q, Elemtype x){ if(q->rear>=MAXNUM-1) return FALSE;q->rear++;q->queue[q->rear]=x;return TRUE;/*出队*/Elemtype Delete(sqqueue *q){ Elemtype x;if (q->front==q->rear) return 0;x=q->queue[++q->front];return x;}/*判断队列是否为空*/int Empty(sqqueue *q){ if (q->front==q->rear) return TRUE;return FALSE;}/*取队头元素*/int gethead(sqqueue *q){ if (q->front==q->rear) return 0;return(q->queue[q->front+1]);}/*遍历队列*/void display(sqqueue *q){ int s;s=q->front;if (q->front==q->rear)printf("队列空!\n");else{printf("\n顺序队列依次为:");while(s<q->rear){s=s+1;printf("%d<-", q->queue[s]);}printf("\n");printf("顺序队列的队尾元素所在位置:rear=%d\n",q->rear);printf("顺序队列的队头元素所在位置:front=%d\n",q->front);}}/*建立顺序队列*/void Setsqqueue(sqqueue *q){ int n,i,m;printf("\n请输入将要入顺序队列的长度:");scanf("%d",&n);printf("\n请依次输入入顺序队列的元素值:\n");for (i=0;i<n;i++){ scanf("%d",&m);append(q,m);}main(){ sqqueue *head;int x,y,z,select;head=(sqqueue*)malloc(sizeof(sqqueue));do{printf("\n第一次使用请初始化!\n");printf("\n请选择操作(1--7):\n");printf("===================================\n");printf("1 初始化\n");printf("2 建立顺序队列\n");printf("3 入队\n");printf("4 出队\n");printf("5 判断队列是否为空\n");printf("6 取队头元素\n");printf("7 遍历队列\n");printf("===================================\n");scanf("%d",&select);switch(select){case 1:{ initQueue(head);printf("已经初始化顺序队列!\n");break;}case 2:{ Setsqqueue(head);printf("\n已经建立队列!\n");display(head);break;}case 3:{ printf("请输入队的值:\n ");scanf("%d",&x);append(head,x);display(head);break;}case 4:{ z=Delete(head);printf("\n队头元素%d已经出队!\n",z);display(head);break;}case 5:{ if(Empty(head))printf("队列空\n");elseprintf("队列非空\n");break;}case 6:{ y=gethead(head);printf("队头元素为:%d\n",y);break;}case 7:{ display(head);break;}}}while(select<=7);}4.链队列的基本操作(链队列的初始化、进队、出对操作)#include<stdio.h>#include<stdlib.h>#define ElemType inttypedef struct Qnode{ ElemType data;struct Qnode *next;}Qnodetype;typedef struct{ Qnodetype *front;Qnodetype *rear;}Lqueue;/*初始化并建立链队列*/void creat(Lqueue *q){ Qnodetype *h;int i,n,x;printf("输入将建立链队列元素的个数:n= ");scanf("%d",&n);h=(Qnodetype*)malloc(sizeof(Qnodetype));h->next=NULL;q->front=h;q->rear=h;for(i=1;i<=n;i++){ printf("链队列第%d个元素的值为:",i);scanf("%d",&x);Lappend(q,x);}}/*入链队列*/void Lappend(Lqueue *q,int x){ Qnodetype *s;s=(Qnodetype*)malloc(sizeof(Qnodetype));s->data=x;s->next=NULL;q->rear->next=s;q->rear=s;}/*出链队列*/ElemType Ldelete(Lqueue *q){ Qnodetype *p;ElemType x;if(q->front==q->rear){ printf("队列为空!\n");x=0;}else{ p=q->front->next;q->front->next=p->next;if(p->next==NULL)q->rear=q->front;x=p->data;free(p);}return(x);}/*遍历链队列*/void display(Lqueue *q){ Qnodetype *p;p=q->front->next; /*指向第一个数据元素节点*/printf("\n链队列元素依次为:");while(p!=NULL){ printf("%d-->",p->data);p=p->next;}printf("\n\n遍历链队列结束!\n");}main(){ Lqueue *p;int x,cord;printf("\n*****第一次操作请选择初始化并建立链队列!*****\n ");do{ printf("\n 链队列的基本操作\n ");printf("=========================================\n");printf(" 主菜单\n");printf("=========================================\n");printf(" 1 初始化并建立链队列\n");printf(" 2 入链队列\n");printf(" 3 出链队列\n");printf(" 4 遍历链队列\n");printf(" 5 结束程序运行\n");printf("==========================================\n");scanf("%d",&cord);switch(cord){ case 1:{ p=(Lqueue *)malloc(sizeof(Lqueue));creat(p);display(p);}break;case 2:{ printf("请输入队列元素的值:x=");scanf("%d",&x);Lappend(p,x);display(p);}break;case 3:{ printf("出链队列元素:x=%d\n",Ldelete(p));display(p);}break;case 4:{display(p);}break;case 5:{exit (0);}}}while (cord<=5);}5.循环队列的基本操作:#include<stdio.h>#include<iostream.h>#include<malloc.h>#define maxsize 100struct Queue{int *base;int front;int rear;};void initQueue(Queue &Q){Q.base=(int *)malloc(maxsize*sizeof(int));Q.front=Q.rear=0;}int QueueLen(Queue Q){return(Q.rear-Q.front+maxsize)%maxsize;}void EnQueue(Queue &Q,int e){if((Q.rear+1)%maxsize==Q.front)cout<<"队列已满,无法插入!"<<endl;else{Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%maxsize;}}int DeQueue(Queue &Q,int &e){if(Q.rear==Q.front) cout<<"队列已空,无法删除!"<<endl;else{e=Q.base[Q.front]; Q.front=(Q.front+1)%maxsize;cout<<"被删除的元素是:"<<'\t'<<e<<endl;return e;}}void main(){Queue Q;initQueue(Q);loop:cout<<'\t'<<"请选择你要进行的操作:"<<endl;cout<<'\t'<<"1.插入元素"<<endl<<'\t'<<"2.删除元素"<<endl<<'\t'<<"3.求队列长度"<<endl<<'\t'<<"4.结束"<<endl;int i; cin>>i;switch(i){case(1):{int e;cout<<"请输入要插入的元素:"<<'\t';cin>>e;EnQueue(Q,e);goto loop;}case(2):{int e;DeQueue(Q,e);goto loop;}case(3):{int l;l=QueueLen(Q);cout<<"队列的长度为:"<<'\t'<<l<<endl;goto loop;}case(4):break;default:cout<<"输入错误,请重新输入!"<<endl;goto loop;}}6.两个栈实现队列的功能#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<iostream.h>#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef char SElemType;typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;//队列由两个栈S1,S2构成typedef struct{SqStack S1;SqStack S2;}Queue;void InitStack(SqStack *S){S->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!S->base) exit(0);S->top=S->base; S->stacksize=STACK_INIT_SIZE;}void push(SqStack *S,SElemType e){if(S->top-S->base==S->stacksize){S->base=(SElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType));if(!S->base) exit(0);S->top=S->base+S->stacksize;S->stacksize+=STACKINCREMENT;}*(S->top)++=e;}void pop(SqStack *S,SElemType *e){if(S->top==S->base) exit(0);S->top--; *e=*(S->top);}//队列的相关操作void InitQueue(Queue *Q){InitStack(&(Q->S1));InitStack(&(Q->S2));}void EnQueue(Queue *Q,SElemType e){push(&(Q->S1),e);}void DeQueue(Queue *Q,SElemType *e){if((Q->S2).top==(Q->S2).base){while((Q->S1).top!=(Q->S1).base){pop(&(Q->S1),e);push(&(Q->S2),*e);} pop(&(Q->S2),e);}else pop(&(Q->S2),e);}int QueueEmpty(Queue Q){if(Q.S1.base==Q.S1.top&&Q.S2.base==Q.S2.top) return 0;else return 1;}void main(){SElemType e; Queue Q; int i;InitQueue(&Q);for(i=0;i<10;i++) EnQueue(&Q,'a'+i);while(QueueEmpty(Q)!=0){DeQueue(&Q,&e); cout<<e;}cout<<endl;}7.用双端队列模拟栈#include<stdio.h>#include<malloc.h>#include<stdlib.h>#define null 0typedef struct QNode{int data;struct QNode *next;struct QNode *prior;}QNode;typedef struct{QNode *front1,*front2;QNode *rear1,*rear2;}LinkDeque;LinkDeque InitQueue(){LinkDeque Q;Q.front1=Q.rear1=(QNode *)malloc(sizeof(QNode));if(!Q.front1){printf("\n存储分配失败\n");exit(0);}Q.front2=Q.rear2=(QNode *)malloc(sizeof(QNode));if(!Q.front2){printf("\n存储分配失败\n");exit(0);}Q.front1->next=Q.front2;Q.front2->next=Q.front1;return Q;}int EnDeque(LinkDeque &Q,int e){QNode *p;p=(QNode *)malloc(sizeof(QNode));if(!p){printf("\n存储分配失败\n");exit(0);}p->data=e;p->next=Q.front2;p->prior=Q.rear1;Q.rear1->next=p;Q.rear1=p;Q.rear2=Q.front1->next;return 1;}int DeDeque(LinkDeque &Q){int e;QNode *p;if(Q.front1==Q.rear1){printf("栈为空,不能执行删除操作\n");return 0;}p=Q.rear1;e=p->data;p->prior->next=p->next;p->next->prior=p->prior;Q.rear1=p->prior;if(Q.front1==Q.front2){Q.rear1=Q.front1;Q.rear2=Q.front2;}free(p);return e;}int DequeLength(LinkDeque Q){int len=0;QNode *p;p=Q.front1->next;while(p!=Q.front2){len++;p=p->next;}return len;}int Gethead(LinkDeque Q){QNode *p;if(Q.front1!=Q.rear1){p=Q.rear1;return p->data;}}void main(){int i=0,e;LinkDeque Q;QNode *p;Q=InitQueue();printf("\n 1.元素进栈\n 2.元素出栈\n 3.求栈的长度\n 4.取栈顶元素\n 5.退出\n");for(;i!=5;){printf("\n请选择你要进行的操作:");scanf("%d",&i);switch(i){case 1:printf("\n请输入进栈元素:");scanf("%d",&e);EnDeque(Q,e);if(Q.front1!=Q.rear1){printf("\n当前栈元素:");p=Q.front1->next;while(p!=Q.front2){printf("%d ",p->data);p=p->next;}}else printf("当前栈为空\n");break;case 2:if(Q.front1!=Q.rear1)printf("\n已删除%d\n",DeDeque(Q));else printf("栈为空,不能此删除操作\n");if(Q.front1!=Q.rear1){printf("\n当前栈元素:");p=Q.front1->next;while(p!=Q.front2){printf("%d ",p->data);p=p->next;}}else printf("当前栈为空\n");break;case 3:printf("\n栈的长度:%d",DequeLength(Q));break;case 4:if(Q.front1!=Q.rear1)printf("\n栈顶元素:%d\n",Gethead(Q));else printf("栈为空,不能此删除操作\n");break;default:printf("\n结束程序\n");}}}8.约瑟夫队列:#include<stdio.h>#include<malloc.h>#include<iostream.h>#define len sizeof(struct QNode)struct QNode{int data;QNode *next;};void main(){int m,n,k,i,e,num=1;cout<<"请输入总人数:"<<endl; cin>>n;cout<<"请输入出局数:"<<endl; cin>>m;cout<<"请输入开始报数人的编号:"<<endl; cin>>k;QNode *Q,*p,*r,*t;Q=(QNode *)malloc(len);Q->next=Q;Q->data=1;p=Q;for(i=2;i<=n;i++){p->next=(QNode *)malloc(len);p=p->next;p->data=i;}p->next=Q;r=Q;t=r;for(i=1;i<=k-1;i++){t=r;r=r->next;}cout<<"出队顺序为:"<<endl;do{for(i=1;i<=m-1;i++){t=r;r=r->next;}e=r->data;t->next=r->next;r=t->next;cout<<e<<" ";num++;}while(num<=n);cout<<endl;}【小结讨论】1. 一个程序中如果要用到两个栈时,可通过两个栈共享一维数组来实现,即双向栈共享邻接空间。
2数据结构实验报告二(栈和队列及其应用)
实验二 栈和队列及其应用、实验目的1. 掌握栈和队列这两种抽象数据类型的特点,并能在相应的应用问题中正 确选用它们。
2. 熟练掌握栈类型的两种实现方法。
3. 熟练掌握循环队列和链队列的基本操作实现算法。
二、实验内容用队列求解迷宫问题[ 问题描述 ]以一个M*N 的长方阵表示迷宫,0和1分别表示迷宫中的通路和墙壁。
设计 一个程序, 对任意设定的迷宫, 求出一条从入口到出口的通路, 或得出没有通路 的结论。
[ 基本要求 ]实现一个以顺序存储结构的队列类型, 然后编写一个求解迷宫的非递归程序。
求得的通 路以三元组(i ,j ,pre )的形式输出,其中:(i ,j )指示迷宫中的一个坐标,径中上一个方块在队列中的下标。
三、源代码# include <stdio.h>{1,1,1,1,1,1,1}, {1,0,0,0,0,0,1}, {1,0,1,0,0,1,1},pre 表示本路[ 测试数据 ] 由学生任意指定。
#define M 5// #define N 5// 行数 列数 #define MaxSize 100// int mg[M+2][N+2]={// 队最多元素个数 一个迷宫 , 其四周要加上均为 1 的外框 {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 {inti,j;int pre;}Box; typedef struct{Boxdata[MaxSize];int front, rear;}QuType;void mgpath1(int xi,int yi,intxe,int ye) // ->(xe,ye) { void print (QuType qu, int front );搜索路径为:( xi ,yi ) inti,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) case0 :i=qu.data[qu.front].i-1;j=qu.data[qu.front].j;break;case1:i=qu.data[qu.front].i;j=qu.data[qu.front].j+1;break;case2:i=qu.data[qu.front].i+1;j=qu.data[qu.front].j+1;break;case3: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(k<MaxSize){if(qu.data[k].pre==-1){ns++;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");四、测试结果:文档来源为:从网络收集整理.word 版本可编辑.欢迎下载支持.做实验首先要掌握大量的理论知识,大的困难,这就要需要我们的毅力。
栈和队列的应用实验报告
栈和队列的应用实验报告
《栈和队列的应用实验报告》
一、实验目的
本实验旨在通过实际操作,掌握栈和队列的基本概念、操作及应用,加深对数
据结构的理解和应用能力。
二、实验内容
1. 栈的基本操作:包括入栈、出栈、获取栈顶元素等。
2. 队列的基本操作:包括入队、出队、获取队首元素等。
3. 栈和队列的应用:通过实际案例,探讨栈和队列在实际生活中的应用场景。
三、实验步骤
1. 学习栈和队列的基本概念和操作。
2. 编写栈和队列的基本操作代码,并进行调试验证。
3. 分析并实现栈和队列在实际应用中的案例,如表达式求值、迷宫问题等。
4. 进行实际应用案例的测试和验证。
四、实验结果
1. 成功实现了栈和队列的基本操作,并通过实际案例验证了其正确性和可靠性。
2. 通过栈和队列在实际应用中的案例,加深了对数据结构的理解和应用能力。
五、实验总结
通过本次实验,我深刻理解了栈和队列的基本概念和操作,并掌握了它们在实
际应用中的重要性和作用。
栈和队列作为数据结构中的重要内容,对于解决实
际问题具有重要意义,希望通过不断的实践和学习,能够更加熟练地运用栈和
队列解决实际问题,提高自己的编程能力和应用能力。
六、感想与展望
本次实验让我对栈和队列有了更深入的了解,也让我对数据结构有了更加深刻的认识。
我将继续学习和探索更多的数据结构知识,提高自己的编程能力和解决问题的能力,为将来的学习和工作打下坚实的基础。
同时,我也希望能够将所学知识应用到实际工程中,为社会做出更大的贡献。
数据结构栈和队列实验报告简版
数据结构栈和队列实验报告数据结构栈和队列实验报告1. 实验目的本实验的主要目的是通过实践的方式理解并掌握数据结构中栈和队列的概念、特点和基本操作。
通过实验,我们可以加深对栈和队列的理解,掌握栈和队列的应用方法,并能够设计和实现基于栈和队列的算法。
2. 实验内容本实验分为两个部分:栈的应用和队列的应用。
2.1 栈的应用栈是一种具有特定限制的线性表,它只允许在表的一端进行插入和删除操作,该端被称为栈顶。
栈的特点是“后进先出”(Last In First Out, LIFO),即最后进栈的元素最先出栈。
在本实验中,我们将实现一个简单的栈类,并应用栈来解决一个问题。
假设有一个字符串,其中包含了括号(圆括号、方括号和花括号),我们需要判断该字符串中的括号是否匹配。
为了达到这个目的,我们可以使用栈来辅助实现。
在实现过程中,我们可以定义一个栈来存储左括号,然后依次遍历字符串的每个字符。
当遇到左括号时,将其入栈;当遇到右括号时,判断栈顶是否是对应的左括号,如果是,则将栈顶元素出栈,否则说明括号不匹配。
最后,当栈为空时,表明所有的括号都匹配,否则说明括号不匹配。
2.2 队列的应用队列是一种具有特定限制的线性表,它只允许在表的一端进行插入操作(队尾),在表的另一端进行删除操作(队头)。
队列的特点是“先进先出”(First In First Out, FIFO),即最早进队列的元素最先出队列。
在本实验中,我们将实现一个简单的队列类,并应用队列来解决一个问题。
假设有一群人在排队等候,我们需要按照一定规则进行排队并输出结果。
为了达到这个目的,我们可以使用队列来进行模拟。
在实现过程中,我们可以定义一个队列来存储等候的人,然后依次将人入队列。
当需要输出结果时,我们可以通过队列的出队列操作,按照先后顺序依次输出到达队头的人。
通过使用队列,我们可以模拟人们排队等候的实际情况,并能够按照一定规则输出结果。
3. 实验过程本实验的实验过程如下:1. 首先,我们需要实现一个栈类。
数据结构-堆栈和队列实验报告
数据结构-堆栈和队列实验报告数据结构堆栈和队列实验报告一、实验目的本次实验的主要目的是深入理解和掌握数据结构中的堆栈和队列的基本概念、操作原理以及实际应用。
通过实际编程实现堆栈和队列的相关操作,加深对其特性的认识,提高编程能力和解决问题的能力。
二、实验环境本次实验使用的编程语言为 Python,开发工具为 PyCharm。
三、实验原理(一)堆栈(Stack)堆栈是一种特殊的线性表,其操作遵循“后进先出”(Last In First Out,LIFO)的原则。
可以将堆栈想象成一个只能从一端进行操作的容器,新元素总是被添加到这一端(称为栈顶),而取出元素也只能从栈顶进行。
堆栈的基本操作包括:1、`push`:将元素压入堆栈。
2、`pop`:弹出堆栈顶部的元素。
3、`peek`:查看堆栈顶部的元素,但不弹出。
(二)队列(Queue)队列是另一种特殊的线性表,其操作遵循“先进先出”(First In First Out,FIFO)的原则。
可以将队列想象成一个排队的队伍,新元素在队尾加入,而取出元素从队首进行。
队列的基本操作包括:1、`enqueue`:将元素加入队列的尾部。
2、`dequeue`:取出并删除队列头部的元素。
3、`front`:查看队列头部的元素,但不取出。
四、实验内容(一)堆栈的实现```pythonclass Stack:def __init__(self):selfitems =def push(self, item):selfitemsappend(item)def pop(self):if not selfis_empty():return selfitemspop()else:return "Stack is empty" def peek(self):if not selfis_empty():return selfitems-1else:return "Stack is empty" def is_empty(self):return len(selfitems) == 0 def size(self):return len(selfitems)```(二)队列的实现```pythonclass Queue:def __init__(self):selfitems =def enqueue(self, item):selfitemsappend(item)def dequeue(self):if not selfis_empty():return selfitemspop(0) else:return "Queue is empty" def front(self):if not selfis_empty():return selfitems0else:return "Queue is empty" def is_empty(self):return len(selfitems) == 0 def size(self):return len(selfitems)```(三)应用实例1、利用堆栈实现括号匹配的验证```pythondef is_balanced_parentheses(exp):stack = Stack()for char in exp:if char in '({':stackpush(char)elif char in ')}':if stackis_empty():return Falsetop = stackpop()if (char ==')' and top!='(') or (char =='}' and top!='{') or (char =='' and top!=''):return Falsereturn stackis_empty()```2、利用队列实现打印杨辉三角的前 n 行```pythondef print_yanghui_triangle(n):queue = Queue()queueenqueue(1)print(1)for i in range(1, n):prev_row =for _ in range(i + 1):num = queuedequeue()prev_rowappend(num)print(num, end="")if _< i:new_num = prev_row_ +(prev_row_ 1 if _> 0 else 0) queueenqueue(new_num)print()```五、实验结果与分析(一)堆栈实验结果对于括号匹配的验证,输入`"((()))"`,输出为`True`,表示括号匹配正确;输入`"((())"`,输出为`False`,表示括号匹配错误。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告
实验名称:栈和队列及其应用
班级: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();
}
五、实验结果与分析
六、实验心得
在调试程序的过程中,感触颇多。
在我所编译的程序中,算得上是一个比较繁琐的程序。
若想程序完善,好多方面都需要考虑到。
但在每一段程序中,有一点疏忽就可能导致整个程序无法运行。