C++ 后缀求值,为什么push函数不更新栈顶变量?
当输入“53+”时,它按5并将tos从“-1”更新为0,但当第二次调用该函数时,它按3,但tos仍然为0,而不是1。请帮忙C++ 后缀求值,为什么push函数不更新栈顶变量?,c++,stack,postfix-notation,C++,Stack,Postfix Notation,当输入“53+”时,它按5并将tos从“-1”更新为0,但当第二次调用该函数时,它按3,但tos仍然为0,而不是1。请帮忙 #include<iostream> using namespace std; int push(int tos, int x); int pop(int tos); int st[50]; int tos=-1; int main() { char str[30]; int r,k,v1,v2,i; cin>>st
#include<iostream>
using namespace std;
int push(int tos, int x);
int pop(int tos);
int st[50];
int tos=-1;
int main()
{
char str[30];
int r,k,v1,v2,i;
cin>>str;
for(i=0;str[i]!='\0';i++)
{
if(str[i]!='*'&&str[i]!='-'&&str[i]!='+'&&str[i]!='/')
{
k=str[i]-'0';
push(tos,k);
}
else
{
if(tos==-1||tos==0)
cout<<"enter correct format";
else
{
v1=pop(tos);
v2=pop(tos);
switch(str[i])
{
case '*': r=v1*v2;
push(tos,r);
break;
case '+': r=v1+v2;
push(tos,r);
break;
case '-': r=v1-v2;
push(tos,r);
break;
case '/': r=v1/v2;
push(tos,r);
break;
default:
cout<<"invalid";
}
}
}
}
r=pop(tos);
cout<<endl<<r;
return 0;
}
int push(int tos, int x)
{
if (tos==50-1)
cout<<"overflow"<<endl;
else
{
tos++;
st[tos]=x;
cout<<endl<<"pushed"<<tos<<st[tos];
}
}
int pop(int tos)
{
int z;
if(tos==-1)
cout<<"underflow";
else
{
z=st[tos];
tos-=1;
}
return z;
}
#包括
使用名称空间std;
int-push(int-tos,int-x);
int pop(int tos);
int st[50];
int-tos=-1;
int main()
{
char-str[30];
int r,k,v1,v2,i;
cin>>str;
对于(i=0;str[i]!='\0';i++)
{
if(str[i]!='*'&&str[i]!='-'&&str[i]!='+'&&str[i]!='/'))
{
k=str[i]-'0';
推力(tos,k);
}
其他的
{
如果(tos==1 | | tos==0)
cout基本问题是有两个变量称为tos
首先是这个全局变量
int tos=-1;
int main()
{
然后在push
函数中有另一个名为tos
的变量
int push(int tos, int x)
{
此时,您的代码更改了局部变量,但没有更改全局变量,因此会产生混淆。使用相同名称的局部变量和全局变量会带来麻烦。在这种情况下,我建议您删除局部变量。st
数组作为全局变量进行操作,因此tos变量必须相同
int push(int x)
{
您还必须将每个呼叫更改为push
push(tos,r);
变成
push(r);
等等等等
然后您需要对具有完全相同问题的pop
函数进行完全相同的更改。基本问题是您有两个名为tos
的变量
首先是这个全局变量
int tos=-1;
int main()
{
然后在push
函数中有另一个名为tos
的变量
int push(int tos, int x)
{
此时,您的代码更改了局部变量,但没有更改全局变量,因此会产生混淆。使用相同名称的局部变量和全局变量会带来麻烦。在这种情况下,我建议您删除局部变量。st
数组作为全局变量进行操作,因此tos变量必须相同
int push(int x)
{
您还必须将每个呼叫更改为push
push(tos,r);
变成
push(r);
等等等等
然后,您需要对具有完全相同问题的pop
函数进行完全相同的更改。您的push()
和pop()
函数按值接收tos
,因此它们对tos
所做的任何更改都不会反映在函数之外
一种解决方案是通过引用传递tos
,例如
int push(int &tos, int x)
{
// Any changes to tos are now reflected in the variable passed in.
...
}
您的push()
和pop()
函数按值接收tos
,因此它们对tos
所做的任何更改都不会反映在函数之外
一种解决方案是通过引用传递tos
,例如
int push(int &tos, int x)
{
// Any changes to tos are now reflected in the variable passed in.
...
}
投票以键入方式关闭。您需要通过引用传递,以便函数修改传递给它的内容。int-push(int-tos,int-x)
->int-push(int&tos,int-x)
和int-pop(int-tos)
->int-pop(int-tos)
这似乎是一个很好的时机。这里的缩进就像过山车一样。你能试着把它弄清楚,这样我们就可以按照你想做的做吗?打开警告,你有一个未初始化的变量和一个不返回值的函数。投票以键入方式关闭。你需要通过引用来传递函数n修改传递给它的内容。int-push(int-tos,int-x)
->int-push(int&tos,int-x)
和int-pop(int-tos)
->int-pop(int&tos)
这似乎是一个很好的时机。这里的缩进就像过山车一样。你能试着把它弄清楚,这样我们就可以按照你想做的做吗?打开警告,你有一个未初始化的变量和一个不返回值的函数。