C++ 后缀求值,为什么push函数不更新栈顶变量?

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

当输入“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>>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)
这似乎是一个很好的时机。这里的缩进就像过山车一样。你能试着把它弄清楚,这样我们就可以按照你想做的做吗?打开警告,你有一个未初始化的变量和一个不返回值的函数。