后缀评估,为什么push函数不更新栈顶变量?

时间:2019-07-17 19:32:33

标签: 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>>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;
}

当提供输入“ 53+”时,它将压入5并将tos从'-1'更新为0,但是当第二次调用该函数时,它将压入3但tos仍为0而不是1。

2 个答案:

答案 0 :(得分:0)

基本问题是您有两个名为tos的变量。

首先是这个全局变量。

int tos=-1;
int main()
{

然后在tos函数中有另一个名为push的变量

int push(int tos, int x)
{ 

目前,您的代码更改了局部变量,但没有更改全局变量,因此造成了混乱。具有相同名称的局部变量和全局变量会带来麻烦。在这种情况下,我建议您删除局部变量。 st数组作为全局数组进行操作,因此tos变量相同是合乎逻辑的。

int push(int x)
{ 

您还必须更改每个呼叫以进行推送

                       push(tos,r);

成为

                       push(r);

等等

然后,您需要对pop函数进行完全相同的更改,而该问题也完全相同。

答案 1 :(得分:0)

您的CGAffineTransform(a: 0.0, b: 1.0, c: -1.0, d: 0.0, tx: 720.0, ty: 0.0)push()函数按值接收pop(),因此它们对tos所做的任何更改都不会反映在函数外部。

一种解决方案是通过引用传递tos,例如

tos