实验三 栈和队列的操作

实验性质:验证性实验

要求:

(1)编程实现栈的以下基本操作:建栈,取栈顶元素,入栈,出栈。
(2)编程实现队列的以下基本操作:建队列,取队头元素,入队,出队。

目的:

(1)掌握栈的顺序存储结构、链式存储结构及其基本操作;
(2)掌握队列的顺序存储结构、链式存储结构及其基本操作。

代码

#include <iostream>
#include <cstdlib>
using namespace std;
#define MAXSIZE 100

typedef int SElemType;
typedef int QElemType;
typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;
typedef struct
{
    QElemType *base;
    int front;
    int rear;
}SqQueue;

void InitStack(SqStack &S); //顺序栈的初始化
void Push(SqStack &S,int v);//顺序栈的入栈
void Pop(SqStack &S); //删除栈顶元素
void GetTop(SqStack S); //取栈顶元素
void DisplayS(SqStack S);    //显示顺序栈元素
void InitQueue(SqQueue &Q); //循环队列的初始化
void EnQueue(SqQueue &Q,int v); //循环队列的入队
void DeQueue(SqQueue &Q);   //循环队列的出队
void GetHead(SqQueue Q);    //取循环队列的队头
void DisplayQ(SqQueue Q);    //显示循环队列元素

void Menu();  //文字菜单提示信息

int main()
{
    SqStack S;
    Menu();
    InitStack(S);
    SqQueue Q;
    InitQueue(Q);
    int v,i;    //插入元素的数值和操作代码
    cout<<"请输入操作代码:";
    cin>>i;
    while(true)
    {
        switch(i)
        {
        case 1:
            cout<<"输入要插入的值:";
            cin>>v;
            Push(S,v);
            break;
        case 2:
            Pop(S);
            break;
        case 3:
            GetTop(S);
            break;
        case 4:
            DisplayS(S);
            break;
        case 5:
            cout<<"输入要插入的值:";
            cin>>v;
            EnQueue(Q,v);
            break;
        case 6:
            DeQueue(Q);
            break;
        case 7:
            GetHead(Q);
            break;
        case 8:
            DisplayQ(Q);
            break;
        case 9:
            system("cls");
            Menu();
            break;
        default:
            if(i<0)
                return 0;
            else
            {
                cout<<"输入的位置非法,请重新输入";
                break;
            }
        }
        cout<<"请输入操作代码:";
        cin>>i;
    }
    return 0;
}
void InitStack(SqStack &S) //顺序栈的初始化
{
    S.base=new SElemType[MAXSIZE];
    if(!S.base)
        cout<<"存储分配失败"<<endl;
    else
    {
        S.top=S.base;   //top初始化为base,空栈
        S.stacksize=MAXSIZE;
    }
}
void Push(SqStack &S,int v)//顺序栈的入栈
{
    if(S.top-S.base==S.stacksize)
        cout<<"当前栈已满"<<endl;
    else
    {
        *S.top++=v;
        cout<<"入栈成功"<<endl;
    }
}
void Pop(SqStack &S) //删除栈顶元素
{
    if(S.top==S.base)
        cout<<"当前栈为空栈,无法出栈"<<endl;
    else
    {
        --S.top;
        cout<<"出栈成功"<<endl;
    }
}
void GetTop(SqStack S) //取栈顶元素
{
    if(S.top!=S.base)
        cout<<"栈顶元素为:"<<*(S.top-1)<<endl;
    else
        cout<<"当前栈为空栈"<<endl;
}
void DisplayS(SqStack S)    //显示顺序栈元素
{
    if(S.top==S.base)
        cout<<"当前栈为空栈"<<endl;
    else
    {
        cout<<"栈中元素为";
        while(S.top!=S.base)
            cout<<*--S.top<<" ";
        cout<<endl;
    }
}
void InitQueue(SqQueue &Q) //循环队列的初始化
{
    Q.base=new QElemType[MAXSIZE];
    if(!Q.base)
        cout<<"存储分配失败"<<endl;
    else
        Q.front=Q.rear=0;
}
void EnQueue(SqQueue &Q,int v) //循环队列的入队
{
    if((Q.rear+1)%MAXSIZE==Q.front)
        cout<<"循环队列已满,无法插入"<<endl;
    else
    {
        Q.base[Q.rear]=v;
        Q.rear=(Q.rear+1)%MAXSIZE;
        cout<<"入队成功"<<endl;
    }
}
void DeQueue(SqQueue &Q)   //循环队列的出队
{
    if(Q.front==Q.rear)
        cout<<"循环队列为空,无法出队"<<endl;
    else
    {
        Q.front=(Q.front+1)%MAXSIZE;
        cout<<"出队成功"<<endl;
    }
}
void GetHead(SqQueue Q)    //取循环队列的队头
{
    if(Q.front!=Q.rear)
        cout<<"队头为:"<<Q.base[Q.front]<<endl;
}
void DisplayQ(SqQueue Q)    //显示循环队列元素
{
    if(Q.front!=Q.rear)
    {
        int i=0;
        while(((Q.front+i)%MAXSIZE)!=Q.rear)
        {
            cout<<Q.base[(Q.front+i)%MAXSIZE]<<" ";
            i++;
        }
        cout<<endl;
    }
    else
        cout<<"循环队列为空"<<endl;
}
void Menu()
{
    cout << "----------------------------------------" << endl;
    cout << "**by 夏日 https://blog.csdn.net/zss192**" << endl;
    cout << "----------------------------------------" << endl;
    cout << "1-----顺序栈入栈"<< endl;
    cout << "2-----顺序栈出栈" << endl;
    cout << "3-----取栈顶元素" << endl;
    cout << "4-----显示顺序栈元素" << endl;
    cout << "5-----循环队列入队" << endl;
    cout << "6-----循环队列出队" << endl;
    cout << "7-----取循环队列队头元素" << endl;
    cout << "8-----显示循环队列元素" << endl;
    cout << "9-----清屏" <<endl;
    cout << "   退出,输入一个负数!" << endl;
}

写在最后

本文章仅供个人复习使用,如有错误,请联系我更正。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值