如何使用ASCII转换使用字符堆栈来计算后缀表达式

时间:2018-04-18 12:39:03

标签: c++ stack postfix-notation

使用ADT通过包含“stack.h”用户定义的头文件来实现代码。

头文件包含堆栈操作的代码。 由于ASCII转换不正确,我将输出视为奇怪的符号。

我应该在代码中做出哪些更改才能获得正确的输出。

#include<iostream>
#include<string.h>
#include "stack.h"
using namespace std;

void posteva(char postfix[])
{
    stack s;
    int i=0;
    while(postfix[i]!='\0')
    {
        char x=postfix[i];
        if(isdigit(x))
        {
            s.push(x);
        }
        else
        {
            int op1=s.pop();
            int op2=s.pop();
            int res;
            switch(x)
            {
                case '+':
                    res=op1+op2;
                    break;
                case '-':
                    res=op1-op2;
                    break;
                case '*':
                    res=op1*op2;
                    break;
                case '/':
                    res=op1/op2;
                    break;
                case '%':
                    res=op1%op2;
                    break;  
                case '^':
                    res=op1^op2;
                    break;              
            }
            s.push(res);
        }
        i++;
    }
    cout<<"\n\nRESULT :"<<s.pop();
}

int main()
{
    char postfix[20];
    cout<<"\n\nEnter the postfix : ";
    cin>>postfix;
    posteva(postfix);   
}

2 个答案:

答案 0 :(得分:1)

'2''3'的{​​{3}}值分别为505150 + 51101,恰好是'e'的ASCII值。

您正在添加ASCII 编码的值而不是数字。

要将数字转换为int等效数字,请再次查看该ASCII。在数字方面你不觉得有些模式吗?尝试做例如'3' - '0',看看你得到了什么。

当你得到它时,你将得到你的解决方案。

答案 1 :(得分:0)

您的代码存在的问题是您将数字作为字符推送(这是正常的)但您使用它们就像它们是int一样。如果你只想在堆栈中保留字符,你需要在出路的路上进行转换:

int op1=s.pop() - '0';
int op2=s.pop() - '0';
...
s.push(res + '0');

这种方法存在问题,因为您没有简单的方法来处理多位数字。最好将堆栈转换为整数堆栈,并修改代码以使用多位数输入。

注意: ^是一个XOR,一个按位操作。由于所有其他操作都是算术运算,我想您希望'^'表示将op1提升为op2的幂。在这种情况下,您应该使用数学库中的pow函数。