P!NK_MF 2022-04-03 08:30 采纳率: 60%
浏览 51
已结题

想要实现利用辅助栈实现队列元素的逆置,编译器没有报错但出队和逆置都无法实现,请问问题出在哪里了呢?


#include <iostream>
#define MAXSIZE 100
#define OK 1
#define ERROR 0

typedef struct       //队列的定义
{
    char data[MAXSIZE];
    int front;
    int rear;
}Queue;

typedef struct      //栈的定义
{
    char data[MAXSIZE];
    int top;
}SqStack;

typedef int status;

status InitQueue(Queue &Q)  //队列的初始化
{
    Q.front=Q.rear=0;
    return OK;
}

bool IsEmptyQ(Queue &Q)      //判断队列是否为空
{
    if (Q.front==Q.rear)
        return true;
    else
        return false;
}

bool IsOverQ(Queue &Q)       //判断队列是否为满
{
    if (((Q.rear)%MAXSIZE)==Q.front)   //这里就想到钟表来理解
        return true;
    else
        return false;
}

status InQueue(Queue &Q,int x)   //入队
{
    if (IsOverQ(Q))               //队满不入
        return ERROR;
    else
        Q.data[Q.rear]=x;
        Q.rear++;
}

status OutQueue(Queue &Q,int &x)   //出队
{
    if (IsEmptyQ(Q))            //队空不出
        return ERROR;
    else
        printf("%d\n",Q.front);
    Q.front++;
}

status InitSqStack(SqStack &S)      //初始化栈
{
    S.top=-1;
    return OK;
}

bool IsEmptyS(SqStack &S)     //判断栈是否为空
{
    if (S.top==-1)
        return true;
    else
        return false;
}

bool IsOverS(SqStack &S)    //判断栈是否为满
{
    if (S.top==MAXSIZE-1)
        return true;
    else
        return false;
}

status InSqStack(SqStack &S,int e)  //进栈
{
    if (IsOverS(S))      //栈满不进
        return ERROR;
    else
        S.top=e;
        S.top++;
}

status OutSqStack(SqStack &S,int &e)   //出栈
{
    if (S.top==-1)       //栈空不出
        return ERROR;
    else
        S.top--;
        e=S.top;

}

void ReserveQueue(Queue &Q)
{
    SqStack S;
    int x;
    InitSqStack(S);
    while(!IsEmptyQ(Q))
    {
        OutQueue(Q,x);
        InSqStack(S,x);
    }
    while(!IsEmptyS(S))
    {
        OutSqStack(S,x);
        InQueue(Q,x);
    }
}

void Makemenu()
{
    printf("\t----------------[队列的逆置]---------\n");
    printf("\t\t\t0.退出\n");
    printf("\t\t\t1.入队\n");
    printf("\t\t\t2.出队\n");
    printf("\t\t\t3.逆置\n");
    printf("\t--------------------------------------\n");
    printf("请输入你的选择(0-3):\n");
}
void Key()
{

}

int main()
{
    Makemenu();
    int n;

    Queue Q;
    int x;
    while(1){
    scanf("%d",&n);
    switch(n)
    {
    case 0:
        exit(0);
        system("pause");
        break;
    case 1:
        printf("---------入队---------\n");
        printf("请输入队列元素:",x);
        scanf("%d",&x);
        InQueue(Q,x);
        break;
    case 2:
        printf("---------出队---------\n");
        OutQueue(Q,x);
        break;
    case 3:
        printf("---------逆置---------\n");
        break;
    default:
        printf("输入有误请重新输入:");
    }
    printf("请输入你的选择:");
    }
    ReserveQueue(Q);

    return 0;
}


  • 写回答

1条回答 默认 最新

  • qzjhjxj 2022-04-03 10:23
    关注

    修改处见注释,供参考:

    #include <stdio.h>
    #include <windows.h>
    #define MAXSIZE 100
    #define OK 1
    #define ERROR 0
    
    typedef struct       //队列的定义
    {
        char data[MAXSIZE];
        int front;
        int rear;
    }Queue;
    
    typedef struct      //栈的定义
    {
        char data[MAXSIZE];
        int top;
    }SqStack;
    
    typedef int status;
    
    status InitQueue(Queue& Q)  //队列的初始化
    {
        Q.front = Q.rear = 0;
        return OK;
    }
    
    bool IsEmptyQ(Queue& Q)      //判断队列是否为空
    {
        if (Q.front == Q.rear)
            return true;
        else
            return false;
    }
    
    bool IsOverQ(Queue& Q)       //判断队列是否为满
    {
        if ((Q.rear - Q.front) > MAXSIZE)   //修改
        //if (((Q.rear) % MAXSIZE) == Q.front)   //这里就想到钟表来理解
            return true;
        else
            return false;
    }
    
    status InQueue(Queue& Q, int x)   //入队
    {
        if (IsOverQ(Q))               //队满不入
            return ERROR;
        else{
            Q.data[Q.rear] = x;     //修改
            Q.rear++;
        }
        return OK;
    }
    
    status OutQueue(Queue& Q, int& x) //出队
    {
        if (IsEmptyQ(Q))            //队空不出
            return ERROR;
        else{
            x = Q.data[Q.front];  //修改
            //printf("%d\n", Q.front);
            Q.front++;
        }
        return OK;               //修改
    }
    
    status InitSqStack(SqStack& S) //初始化栈
    {
        S.top = -1;
        return OK;
    }
    
    bool IsEmptyS(SqStack& S)//判断栈是否为空
    {
        if (S.top == -1)
            return true;
        else
            return false;
    }
    
    bool IsOverS(SqStack& S) //判断栈是否为满
    {
        if (S.top == MAXSIZE - 1)
            return true;
        else
            return false;
    }
    
    status InSqStack(SqStack& S, int e)  //进栈
    {
        if (IsOverS(S))      //栈满不进
            return ERROR;
        else{
            S.top++;           //修改
            S.data[S.top] = e;  //修改
        }
        return OK;             //修改
    }
    
    status OutSqStack(SqStack& S, int& e)   //出栈
    {
        if (S.top == -1)       //栈空不出
            return ERROR;
        else{
            e = S.data[S.top];  //修改
            S.top--;            //修改
        }
        return OK;              //修改  
    }
    
    void ReserveQueue(Queue& Q)
    {
        SqStack S;
        int x;
        InitSqStack(S);
        while (!IsEmptyQ(Q))
        {
            OutQueue(Q, x);
            InSqStack(S, x);
        }
        while (!IsEmptyS(S))
        {
            OutSqStack(S, x);
            InQueue(Q, x);
        }
    }
    
    void Makemenu()
    {
        printf("\t----------------[队列的逆置]---------\n");
        printf("\t\t\t0.退出\n");
        printf("\t\t\t1.入队\n");
        printf("\t\t\t2.出队\n");
        printf("\t\t\t3.逆置\n");
        printf("\t--------------------------------------\n");
        printf("请输入你的选择(0-3):\n");
    }
    void print(Queue* Q)      //修改
    {
        int i;
        for (i = Q->front; i < Q->rear; i++)
            printf("%d ", Q->data[i]);
        printf("\n");
    }
    
    int main()
    {
        Makemenu();
        int n, x;
        Queue Q;        //修改
        InitQueue(Q);
        SqStack S;     //修改 
        InitSqStack(S);
    
        while (1) {
            scanf("%d", &n);
            switch (n)
            {
            case 0:
                exit(0);
                system("pause");
                break;
            case 1:
                printf("---------入队---------\n");
                printf("请输入队列元素:", x);
                scanf("%d", &x);
                InQueue(Q, x);
                break;
            case 2:
                printf("---------出队---------\n");
                OutQueue(Q, x);
                break;
            case 3:
                printf("---------逆置---------\n");
                ReserveQueue(Q);
                break;
            default:
                printf("输入有误请重新输入:");
                break;
            }
            print(&Q);          //修改
            system("pause");    //修改
            Makemenu();         //修改
            printf("请输入你的选择:");
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月11日
  • 已采纳回答 4月3日
  • 创建了问题 4月3日

悬赏问题

  • ¥15 VB.NET2022如何生成发布成exe文件
  • ¥30 matlab appdesigner私有函数嵌套整合
  • ¥15 给我一个openharmony跑通webrtc实现视频会议的简单demo项目,sdk为12
  • ¥15 vb6.0使用jmail接收smtp邮件并另存附件到D盘
  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
  • ¥15 求SC-LIWC词典!
  • ¥20 有关esp8266连接阿里云
  • ¥15 C# 调用Bartender打印机打印