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

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无法显示的原因及修复

  1. push方法逻辑错误:当前push方法在栈满时,仅输出溢出提示但仍执行top++和赋值操作,会导致数组越界破坏栈结构,正确逻辑是栈满时直接返回,不执行入栈操作。
  2. display方法参数冗余:方法定义了int ctr参数,但内部重新定义了同名局部变量,虽不影响功能但属于冗余代码,建议删除。
  3. 缺失数组转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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:35:27