c++ - 将值从一个堆栈传输到另一个堆栈,在 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() 的逻辑对于传输值和保持顺序是否正确?
解决方案
您在代码中犯了几个错误。
第一个是类名不匹配:声明一个普通类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);
}