【问题标题】:Transfer values from one stack to another keeping the same order in C++将值从一个堆栈传输到另一个堆栈,在 C++ 中保持相同的顺序
【发布时间】:2021-10-23 08:41:09
【问题描述】:
#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>”没有成员“StackTransfer”

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

【问题讨论】:

标签: c++ arrays data-structures stack


【解决方案1】:

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

第一个是类名不匹配:你声明了一个普通类Stack,然后你使用了一个模板类stack&lt;int&gt;。这是两个不相关的类,当编译器抱怨stack&lt;int&gt; 类没有StackTransfer 方法时,它是绝对正确的。

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

(a) 它只有一个显式参数(另一个是this),
(b) 其名称应表明动作的方向:void StackTransferFrom(Stack &amp;s)void StackTransferTo(Stack &amp;s),
(c) 参数应该是同一个类(Stack,而不是stack&lt;int&gt;),并且
(d) 它将在声明类的某个对象上调用:Stack s1, s2; ....; s1.StackTransferFrom(s2);

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

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

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

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

push() 方法中还隐藏着另一个错误:您在那里使用了后自增运算符,但 top 的初始值是减一。结果,第一个值push-ed 到您的堆栈将被写入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);
    }

【讨论】:

    猜你喜欢
    • 2022-10-17
    • 1970-01-01
    • 2013-12-26
    • 2021-07-15
    • 1970-01-01
    • 2012-02-15
    • 2019-04-26
    • 2020-04-03
    • 2023-02-04
    相关资源
    最近更新 更多