用两个队列实现栈的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
相关产品推荐
相关产品推荐

