数据结构-实验三

栈和队列的操作 

实验内容:

  1. 编程实现顺序栈和链栈的基本操作:建栈,取栈顶元素,入栈,出栈;
  2. 编程实现循环队列和链队列的基本操作:建队列,取队头元素,入队,出队。
    #include<iostream>
    #include<cstdlib>
    #include<cmath>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    using namespace std;
    #define MAXSIZE 100
    #define OK 1
    #define ERROR 0
    typedef int ElemType;
    typedef int Status;
    typedef int SElemType;
    typedef int QElemType;
    typedef struct
    {
        SElemType *base;
        SElemType *top;
        int stacksize;
    } SqStack; //顺序栈的声明
    typedef struct StackNode
    {
        ElemType data;
        struct StackNode *next;
    } StackNode,*LinkStack; //链栈的声明
    
    typedef struct
    {
        QElemType *base;
        int front ;
        int rear;
    } SqQueue; //循环队列的声明
    
    typedef struct QNode
    {
        QElemType data;
        struct QNode *next;
    } QNode,*QueuePtr;
    typedef struct
    {
        QueuePtr front;
        QueuePtr rear;
    } LinkQueue; //链队的声明
    
    Status InitStack1(SqStack &S)//栈的初始化
    {
        S.base=new SElemType[MAXSIZE];
        if(!S.base) exit (OVERFLOW);
        S.top=S.base;
        S.stacksize=MAXSIZE;
        return OK;
    }
    Status Push1(SqStack &S,SElemType e)//进栈
    {
        if(S.top-S.base==S.stacksize)return ERROR;
        *S.top++=e;
        return OK;
    }
    Status Pop1(SqStack &S,SElemType &e)//出栈
    {
        if(S.top==S.base)return ERROR;
        e=*--S.top;
        cout<<e<<" ";
        return OK;
    }
    SElemType GetTop1(SqStack S)//取栈顶元素
    {
        if(S.top!=S.base)
        {
            cout<<*(S.top-1)<<endl;
            return *(S.top-1);
        }
    }
    Status InitStack2(LinkStack &S)//链栈的初始化
    {
        S=NULL;
        return OK;
    }
    Status Push2(LinkStack &S,SElemType e)//链栈的入栈
    {
        LinkStack p;
        p=new StackNode;
        p->data=e;
        p->next=S;
        S=p;
        return OK;
    }
    Status Pop2(LinkStack &S,SElemType &e)//链栈的出栈
    {
        LinkStack p;
        if(S==NULL)return ERROR;
        e=S->data;
        cout<<e<<" ";
        p=S;
        S=S->next;
        delete p;
        return OK;
    }
    SElemType GetTop2(LinkStack S)//链栈的取栈顶元素
    {
        if(S!=NULL)
            cout<<S->data<<endl;
        return S->data;
    }
    Status InitQueue1(SqQueue &Q)//循环队列的初始化
    {
        Q.base=new QElemType[MAXSIZE];
        if(!Q.base)exit(OVERFLOW);
        Q.front=Q.rear=0;
        return OK;
    }
    int QueueLength(SqQueue Q)//求循环队列的长度
    {
        return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
    }
    Status EnQueue1(SqQueue &Q,QElemType e)//循环队列的入队
    {
        if((Q.rear+1)%MAXSIZE==Q.front)
            return ERROR;
        Q.base[Q.rear]=e;
        Q.rear=(Q.rear+1)%MAXSIZE ;
        return OK;
    }
    Status DeQueue1(SqQueue &Q,QElemType &e)//循环队列出队
    {
        if(Q.front==Q.rear)return ERROR;
        e=Q.base[Q.front];
        Q.front=(Q.front+1)%MAXSIZE;
        cout<<e<<" ";
        return OK;
    }
    SElemType GetHead1(SqQueue Q)//循环队列取队头元素
    {
        if(Q.front!=Q.rear)
            cout<<Q.base[Q.front];
        cout<<endl;
        return Q.base[Q.front];
    }
    Status InitQueue2(LinkQueue &Q)//链队的初始化
    {
        Q.front=Q.rear=new QNode;
        Q.front->next=NULL;
        return OK;
    }
    Status EnQueue2(LinkQueue &Q,QElemType e)//链队的入队
    {
        QueuePtr p;
        p=new QNode;
        p->data=e;
        p->next=NULL;
        Q.rear->next=p;
        Q.rear=p;
        return OK;
    }
    Status DeQueue2(LinkQueue &Q,QElemType &e)//链队的出队
    {
        QueuePtr p;
        if(Q.front==Q.rear)return ERROR;
        p=Q.front->next;
        e=p->data;
        Q.front->next=p->next;
        if(Q.rear==p) Q.rear=Q.front;
        delete p;
        cout<<e<<" ";
        return OK;
    }
    SElemType GetHead2(LinkQueue Q)
    {
        if(Q.front!=Q.rear)
            cout<<Q.front->next->data;
        cout<<endl;
        return Q.front->next->data;
    }
    int main()
    {
        SqStack S;
        int i,n,x,j,y,e,m,a,b,c,d;
        InitStack1(S);
        cout<<"请输入一个数表示顺序栈的长度"<<endl;
        cin>>n;
        cout<<"进栈"<<endl;
        for(i=0; i<n; i++)//让从0到n-1的数据进栈
        {
            cin>>c;
            Push1(S,c);
        }
        cout<<"取顺序栈的栈顶元素"<<endl;
        GetTop1(S);
        cout<<"显示顺序栈中的数据元素,让其出栈"<<endl;
        for(j=0; j<n; j++)
        {
            Pop1(S,x);
        }
        cout<<endl;
        //顺序栈的进栈,出栈,取栈顶元素
        cout<<endl;
        LinkStack S1;
        InitStack2(S1);
        cout<<"请输入一个数表示链栈的长度"<<endl;
        cin>>n;
        cout<<"进栈"<<endl;
        for(i=0; i<n; i++)//让从0到n-1的数据进栈
        {
            cin>>d;
            Push2(S1,d);
        }
        cout<<"取链栈的栈顶元素"<<endl;
        GetTop2(S1);
        cout<<"显示链栈中的数据元素,让其出栈"<<endl;
        for(j=0; j<n; j++)
        {
            Pop2(S1,y);
        }
        cout<<endl;
        //链栈的进栈,出栈和取栈顶元素
        cout<<endl;
        SqQueue Q;
        InitQueue1 (Q);
        cout << "1.入队" << endl;
        cout<<"请输入一个数表示循环队列长度"<<endl;
        cin>>n;
        for ( i = 0; i < n; i++)
        {
            cin >> e;
            EnQueue1(Q, e);
        }
        cout << "2.取队头元素" << endl;
        GetHead1(Q);
        cout << "3.出队" << endl;
        for ( i = 0; i < n; i++)
        {
            DeQueue1(Q,m);
        }
        cout<<endl;
        //循环队列的入队,取队头元素,出队
        cout<<endl;
        LinkQueue Q1;
        InitQueue2 (Q1);
        cout << "A.入队" << endl;
        cout<<"请输入一个数表示链式队列长度"<<endl;
        cin>>n;
        for ( i = 0; i < n; i++)
        {
            cin >> b;
            EnQueue2(Q1, b);
        }
        cout << "B.取队头元素" << endl;
        GetHead2(Q1);
        cout << "C.出队" << endl;
        for ( i = 0; i < n; i++)
        {
            DeQueue2(Q1,a);
        }
        cout<<endl;
        //链队的入队,取队头元素,出队
        return  0;
    }
    

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值