首页 > 解决方案 > 将值从一个堆栈传输到另一个堆栈,在 C++ 中保持相同的顺序

问题描述

#include <iostream>
#include<stdlib.h>
#include <stack>
using namespace std;

const int MAX = 1000;
class Stack
{
    int top=-1;
    int arr[MAX];

public:

    void push(int value)
    {
        if (top > MAX - 1)
            cout << "Stack Overflow";
        else
             arr[top++] = value;

    }

    int pop()
    {
        if (top == -1)
            cout << "Stack Underflow";
        else
            return arr[top--];

    }


    void StackTransfer(stack <int> &s1, stack <int> &s2)
    {
        int x;
        if (s1.empty())
            return;

        x = s1.top();
        s1.pop();
        StackTransfer(s1, s2);
        s2.push(x);



    }
};


int main()
{
    stack <int> st1, st2, st3;
    st1.push(10);
    st1.push(20);
    st2.push(30);
    st2.push(40);
    cout<<st3.StackTransfer(&st1, &st2);


}

我想传输值,但是当我在 main() 中调用 StackTransfer() 函数时,出现此错误

严重性代码描述项目文件行抑制状态错误(活动) E0135 类“std::stack<int, std::deque<int, std::allocator>>”没有成员“StackTransfer”

StackTransfer() 的逻辑对于传输值和保持顺序是否正确?

标签: c++arraysdata-structuresstack

解决方案


您在代码中犯了几个错误。

第一个是类名不匹配:声明一个普通类Stack,然后使用模板类stack<int>stack<int>那是两个不相关的类,当编译器抱怨该类没有方法时,它是绝对正确的StackTransfer

第二个错误是您尝试调用该方法的方式。该方法要么作用于一个对象,然后:

(a) 它只有一个显式参数(另一个是this),
(b)它的名称应该指示动作的方向:void StackTransferFrom(Stack &s)或者void StackTransferTo(Stack &s)
(c)参数应该是同一个类(Stack,not stack<int>),和
(d)它将在声明的类的某个对象上调用:Stack s1, s2; ....; s1.StackTransferFrom(s2);

或者该方法作用于两个对象,然后:

(a) 它应该被定义为static,并且
(b) 它将用两个参数调用:Stack::StackTransfer(s1, s2);没有任何第三个对象,但是
(c) 带有一个类标识符。

另一种是&在调用函数时使用 & 运算符。您的方法具有引用类型参数,而不是指针,因此您应该使用对变量的引用来调用它:StackTransfer(s1, s2)而不是使用指向它们的指针:StackTransfer(&s1, &s2)。后者将使用静态 voidStackTransferTo(Stack *s1, Stack *s2)方法。

您将结果发送到标准输出的尝试也是错误的——您的函数已声明void,这意味着它不返回任何值,因此您无法从中得到任何可以输出到cout.

该方法中还隐藏着另一个错误push():您在那里使用了后增量运算符,但 的初始值top是减一。因此,在数组开始之前push,您的堆栈中的第一个值将被写入。这会触发程序的未定义行为。arr[-1]

改良版:

    #include <iostream>
    
    const int MAX = 1000;
    class Stack
    {
        int top = -1;
        int arr[MAX];
    
    public:
    
        void push(int value)
        {
            if (top >= MAX - 1)
                std.cout << "Stack Overflow\n";
            else
                arr[++top] = value;
        }
    
        int pop()
        {
            if (top < 0)
                std.cout << "Stack Underflow\n";
            else
                return arr[top--];
        }

        bool empty()
        {
            return top == -1;
        }

        int top()
        {
            if (empty())
            {
                std.cout << "Stack is empty\n";
                return 0;
            }
            return arr[top];
        }
    
        void StackTransfer(Stack &source)
        {
            if (source.empty())
                return;
    
            int x = source.top();
            source.pop();
            StackTransfer(source);
            push(x);
        }
    };
    
    
    int main()
    {
        Stack st1, st2;
        st1.push(10);
        st1.push(20);
        st2.push(30);
        st2.push(40);
        
        st2.StackTransfer(st1);
    }

推荐阅读