Stack无法显示数组数据,Queue显示正常,如何反转Queue并保存回数组?
问题描述
- 通过数组向Stack和Queue传递数据时,Queue可正常显示内容,但Stack完全无法显示。单独的Stack项目中数组转Stack功能正常,集成后出现Stack数据丢失,怀疑Stack类的display方法存在问题。
- 咨询如何反转Queue并将其内容保存回数组。
相关代码
class Stack { private: int MAX; int top; int *grd_s; public: Stack (int size) { MAX=size; top=-1; grd_s=new int[MAX]; } void push(int Q) { if ((top+1)==MAX) cout << "Stack Overflow..." << endl; top++; grd_s[top]=Q; } void display(int ctr) { cout<<"Cloud contains --"<<endl; for (int ctr=top; ctr>=0; ctr--) { if (ctr==top) cout<<" "<<grd_s[ctr]<<"<--Top of Stack"<<endl; else cout<<" "<<grd_s[ctr]<<endl; } } }; class Queue { private: int front; int rear; int grd_q[5]; public: Queue() { front=-1; rear=-1; for (int z=0; z<5; z++) { grd_q[z]=0; } } bool isEmpty() { if (front==-1||rear==-1) return true; else return false; } bool isFull() { if (rear==4) return true; else return false; } void insert(int val) { if(isFull()) { cout<<"Queue is Full..."<<endl; return; } else if (isEmpty()) { rear=0; front=0; grd_q[rear]=val; } else { rear++; grd_q[rear]=val; } } void show() { cout<<"Local contains: "<<endl; for (int x=0; x<5; x++) { cout<<grd_q[x]<<" "; } } void rer() { cout<<"sad"<<endl; } }; // 输入数组的代码片段 case 1: cout <<"Enter your 5 Grades" << endl; for (int i=0; i<5; i++) { cout << " " << i+1 << " . "; cin >> grd; Q[i] = grd; } system("cls"); break;
问题分析与修复
Stack无法显示的原因及修复
- push方法逻辑错误:当前push方法在栈满时,仅输出溢出提示但仍执行
top++和赋值操作,会导致数组越界破坏栈结构,正确逻辑是栈满时直接返回,不执行入栈操作。 - display方法参数冗余:方法定义了
int ctr参数,但内部重新定义了同名局部变量,虽不影响功能但属于冗余代码,建议删除。 - 缺失数组转Stack的代码:提供的代码仅实现了数组输入,未将数组元素push到Stack中,这是集成后数据丢失的核心原因。
修复后的Stack类代码
class Stack { private: int MAX; int top; int *grd_s; public: Stack (int size) { MAX=size; top=-1; grd_s=new int[MAX]; } void push(int val) { if ((top+1)==MAX) { cout << "Stack Overflow..." << endl; return; // 栈满时直接返回,终止入栈 } top++; grd_s[top]=val; } // 删除冗余的ctr参数 void display() { cout<<"Cloud contains --"<<endl; for (int ctr=top; ctr>=0; ctr--) { if (ctr==top) cout<<" "<<grd_s[ctr]<<"<--Top of Stack"<<endl; else cout<<" "<<grd_s[ctr]<<endl; } } // 添加析构函数,避免内存泄漏 ~Stack() { delete[] grd_s; } };
补充数组转Stack的代码
在输入数组的case分支中,添加将数组元素传入Stack的逻辑:
case 1: cout <<"Enter your 5 Grades" << endl; int Q[5]; int grd; for (int i=0; i<5; i++) { cout << " " << i+1 << " . "; cin >> grd; Q[i] = grd; } // 将数组元素push到Stack Stack stack(5); for(int i=0; i<5; i++){ stack.push(Q[i]); } stack.display(); // 调用修复后的display方法 system("cls"); break;
反转Queue并保存回数组的实现方法
可借助Stack实现Queue反转,步骤为:将Queue元素出队入栈,再将栈元素出栈重新入队,最后将反转后的Queue元素存入数组。
先给Queue类补充出队方法
原Queue类缺少出队功能,需添加remove()方法:
class Queue { private: int front; int rear; int grd_q[5]; public: // 原有构造、isEmpty、isFull、insert、show方法不变 // 添加出队方法 int remove() { if(isEmpty()){ cout<<"Queue is Empty..."<<endl; return -1; } int val = grd_q[front]; grd_q[front] = 0; // 队列为空时重置指针 if(front == rear){ front = rear = -1; } else { front++; } return val; } };
实现反转并保存到数组的函数
// 给Stack补充isEmpty和pop方法,避免直接访问私有成员 class Stack { // 原有成员不变 public: bool isEmpty(){ return top == -1; } int pop(){ if(isEmpty()){ cout<<"Stack Underflow..."<<endl; return -1; } return grd_s[top--]; } }; // 反转Queue并保存到数组的函数 void reverseQueueAndSaveToArray(Queue &q, int arr[], int size){ Stack stack(size); // 1. Queue元素全部入栈 while(!q.isEmpty()){ stack.push(q.remove()); } // 2. 栈元素重新入队,完成Queue反转 while(!stack.isEmpty()){ q.insert(stack.pop()); } // 3. 将反转后的Queue元素存入数组 int idx = 0; while(!q.isEmpty()){ arr[idx++] = q.remove(); } // 可选:将数组元素重新放回Queue,恢复队列状态 for(int i=0; i<size; i++){ q.insert(arr[i]); } }
内容的提问来源于stack exchange,提问作者Otaku Sensei
相关产品推荐
相关产品推荐

