栈与队列的应用

来源:互联网 发布:乡村爱情 知乎 编辑:程序博客网 时间: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
原创粉丝点击