栈与队列的应用
来源:互联网 发布:乡村爱情 知乎 编辑:程序博客网 时间:2024/06/05 19:36
实验名称:栈与队列的应用
实验目的:通过实验理解栈和队列的应用
实验内容:
1、输入10个数,并按输入顺序入队,然后将它们逐个出队并输出。
2、输入一串字符,以#结束,利用栈和队列来判断它是否是回文。
3、编写递归函数,求正整数N的阶乘N!。
再编写一个函数,用栈实现求N的阶乘,体会栈与递归的关系。
pow by ZFQ
**#include <iostream.h>**#include <stdlib.h>****#include <string.h>****#include "headz.h"//此头文件是调用第六次作业的头文件,里面包括了栈的初始化**#define MAXQSIZE 100****#define OK 1****#define ERROR 0****#define OVERFLOW -2**#define N 3 //for循环使用**typedef char QElemType;typedef int Status;typedef struct{//栈 SElemType *base; SElemType *top; int stacksize;}SqStack;typedef struct{//队列 QElemType *base;//初始化时动态分配存储空间 int front;//头指针 int rear;//尾指针}SqQueue;void Copyright(){cout<<"********************"<<endl;cout<<"*数据结构CPP BY ZFQ*"<<endl;cout<<"********************"<<endl;}/算法3.1 顺序栈的初始化Status InitStack(SqStack &S){// 构造一个空栈 S S.base = new SElemType[MAXSIZE]; //为顺序栈分配一个最大容量为MAXSIZE的数组空间 if(!S.base) exit (OVERFLOW); //存储分配失败 S.top = S.base; S.stacksize = MAXSIZE; return OK;}//算法3.2 顺序栈的入栈Status Push(SqStack &S,SElemType e){ // 插入元素e为新的栈顶元素 if(S.top-S.base==S.stacksize) return ERROR; //栈满 *(S.top++) = e; //元素e压入栈顶,栈顶指针加1 return OK;}//算法3.3 顺序栈的出栈Status Pop(SqStack &S,SElemType &e){// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if(S.base == S.top) return ERROR;//栈空 e = *(--S.top); //栈顶指针减1,将栈顶元素赋给e return OK;}//算法3.13 循环队列的初始化Status InitQueue(SqQueue &Q){ // 构造一个空队列Q Q.base = new QElemType[MAXQSIZE]; if(!Q.base) return OVERFLOW; // 存储分配失败 Q.front = 0; Q.rear = 0; return OK;}//算法3.14 求循环队列的长度int QueueLength(SqQueue Q){ // 返回Q的元素个数,即队列的长度 return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}//算法3.15 循环队列的入队Status EnQueue(SqQueue &Q,QElemType e){// 插入元素e为Q的新的队尾元素 if((Q.rear+1)%MAXQSIZE == Q.front) { return ERROR;//尾指针在循环意义上加1后等于头指针,表明队满 } Q.base[Q.rear] = e; Q.rear = (Q.rear+1)%MAXQSIZE; return OK;}//算法3.16 循环队列的出队Status DeQueue(SqQueue &Q,QElemType &e){ if(Q.rear == Q.front) return ERROR; e = Q.base[Q.front]; Q.front = (Q.front+1)%MAXQSIZE; return OK;}//算法:判断列队是否队空,如果为空返回true 否则返回 falsebool QueueEmpty(SqQueue &Q){//判断列队是否为空 if(Q.front==Q.rear) return true;//为空 else return false;//不为空}//算法:判断是否为回文bool HuiWen(){ int i; char str[50]; SqStack LA; //构造一个栈 InitStack(LA);//初始化栈 SqQueue LS; //构造一个列队 InitQueue(LS);//初始化列队 cout<<"输字符串入栈,以#号结束:"<<endl; cin>>str; for(i=0;i<50;i++){ if(str[i]=='#') break; Push(LA,str[i]); EnQueue(LS,str[i]); } while(!StackEmpty(LA) && !QueueEmpty(LS)){ char a,b; Pop_T(LA,a); DeQueue(LS,b); if(a!=b) return 0; } return 1;}//算法:递归算法 N的阶乘Nint recursive(int i){ int sum = 0; if (i==0) return (1); else sum = i *recursive(i-1); return sum;}//算法:栈递归int TraverseList(SqStack &S,int i){ int sum=1; if(i==0) return (S,1); else{ Push(S,i);//入栈 Pop(S,i);//出栈 sum=i*TraverseList(S,i-1); } return sum;}
下面是主函数
#include "head.h"void main(){ Copyright();//版权 int i,j,M; char e;//(1)队列的入列和出列 SqQueue SQ; InitQueue(SQ);//初始化列队 cout<<"输入"<<N<<"个数入队:"<<endl; for(i=0;i<N;i++){ cin>>e; EnQueue(SQ,e);//顺序入栈 } cout<<"出队:"<<endl; for(j=0;j<N;j++){ DeQueue(SQ,e); cout<<e<<" "; } cout<<endl;//(2)判断回文 if(HuiWen()) cout<<"此字符串是回文"<<endl; else cout<<"此字符串不是回文"<<endl;//(3-1)递归函数,求正整数N的阶乘N! cout<<"请输入阶乘数"<<endl; int L; cin>>L; cout<<L<<"!="<<recursive(L)<<endl;//(3-2)递归函数,用栈实现阶乘 SqStack S;//构造栈 InitStack(S);//初始化栈 cout<<"栈阶乘:请输入阶乘数"<<endl; cin>>M; cout<<M<<"!="<<TraverseList(S,M)<<endl;}
0 0
- 栈与队列的应用
- 队列的实现与应用
- 队列与栈_栈结构的应用
- 7.6 栈与队列-栈的基本操作和应用
- 数据结构算法问题 栈与队列的应用
- 停车场管理(栈与队列的应用)
- 【数据结构】实验二:栈与队列的应用---表达式求值
- uva 11995 栈,队列,优先队列,等基本数据结构的应用与理解
- 优先队列的详解与应用
- 队列的分类与应用场景
- 单调队列的实现与应用
- TensorFlow 队列与多线程的应用
- 【数据结构与算法】 队列——队列的应用举例
- 栈和队列的应用
- 十进制与二进制之间的转换(栈与队列的应用)
- 栈、队列与优先队列的认识
- 队列的应用:优先队列
- 栈与队列->队列
- free 命令结果完全剖析
- AM3359 U-Boot
- jquery插件源码function加!是什么意思?
- 数据结构实验之查找二:平衡二叉树
- Python OpenCV 图片反色、调整大小、遍历、导出txt
- 栈与队列的应用
- CUDA 7/cuDNN/caffe/DIGITS实战教程
- Android 常用设计模式2 适配器模式
- 分享一百多套开发视频教程的下载地址
- 技术资料备份(持续更新)
- 在eclipse中配置好hadoop的插件后使用DFS遇到的问题
- Fragment放置后台很久(Home键退出很长时间),返回时出现Fragment重叠解决方案
- 简单的联动菜单
- 操作系统---基础题目汇总五