You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用两个队列实现栈的C++代码无输出问题求助

问题分析与修复

1. 队列初始化不完整

在main函数中,初始化队列时仅设置了q1->front和q2->rear为-1,但**q1->rear和q2->front未初始化**,这会导致队列的空/满判断逻辑完全失效,直接引发push、isEmpty等函数行为异常。

修复代码:

Queue *q1=new Queue;
Queue *q2=new Queue;
// 完整初始化所有队列的front和rear
q1->front = q1->rear = -1;
q2->front = q2->rear = -1;
q1->capacity=q2->capacity=10;
q1->arr=(int *)malloc(q1->capacity*sizeof(int));
q2->arr=(int *)malloc(q2->capacity*sizeof(int));

2. Pop函数逻辑完全错误

当前pop函数把q1所有元素移到q2后弹出q2的队首,这对应栈的底部元素,完全违背了栈“后进先出”的核心特性。正确逻辑应为:

  • 将q1中除最后一个元素外的所有元素移动到q2
  • 弹出q1剩余的最后一个元素(栈顶元素)
  • 将q2中的元素移回q1

修正后的pop函数:

int pop(Queue *q1,Queue *q2){
    if(isEmpty(q1)){
        return -1; // 栈空时返回-1
    }
    // 移动除最后一个外的所有元素到q2
    while(q1->front != q1->rear){
        push(q2, removeFront(q1));
    }
    // 弹出栈顶元素
    int res = removeFront(q1);
    // 将q2元素移回q1
    while(!isEmpty(q2)){
        push(q1, removeFront(q2));
    }
    return res;
}

3. 额外规范建议

在C++中混用malloc和delete[]不符合语言规范,建议统一使用new分配数组:

q1->arr = new int[q1->capacity];
q2->arr = new int[q2->capacity];

修复后的完整代码

#include <iostream>
#include <stdlib.h>

using namespace std;

struct Queue{
    int front;
    int rear;
    int capacity;
    int *arr;
};

int isFull(Queue *q){
    return ((q->rear+1)%q->capacity == q->front);
}

int isEmpty(Queue *q){
    return (q->front==-1);
}

void push(Queue *q,int data){
    if(!isFull(q)){
        if(isEmpty(q)){
            q->front=0;
        }
        q->rear=(q->rear+1)%q->capacity;
        q->arr[q->rear]=data;
    }
}

int removeFront(Queue *q){
    if(!isEmpty(q)){
        int result=q->arr[q->front];
        if(q->front==q->rear){
            q->front=q->rear=-1;
        } else {
            q->front=(q->front+1)%q->capacity;
        }
        return result;
    }
    return -1;
}

int pop(Queue *q1,Queue *q2){
    if(isEmpty(q1)){
        return -1;
    }
    while(q1->front != q1->rear){
        push(q2, removeFront(q1));
    }
    int res = removeFront(q1);
    while(!isEmpty(q2)){
        push(q1, removeFront(q2));
    }
    return res;
}

int main(){
    Queue *q1=new Queue;
    Queue *q2=new Queue;
    q1->front = q1->rear = -1;
    q2->front = q2->rear = -1;
    q1->capacity=q2->capacity=10;
    q1->arr = new int[q1->capacity];
    q2->arr = new int[q2->capacity];

    push(q1,10);
    push(q1,20);
    push(q1,30);

    cout<<pop(q1,q2)<<endl; // 输出30
    cout<<pop(q1,q2)<<endl; // 输出20

    delete[] q1->arr;
    delete[] q2->arr;
    delete q1;
    delete q2;

    return 0;
}

运行修复后的代码,会依次输出30和20,符合栈“后进先出”的预期。

内容的提问来源于stack exchange,提问作者Amit Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:25:01