2012-10-03 63 views
2

对于赋值,我们给出了一个反向波兰表示式。对于这个例子,我将使用:2 3 8 * + $$用于表示表达式的结尾。使用堆栈,我们输出答案。搜索运算符的cstring

我一直在使用:

getline(cin, input, '&'); 
input.c_str(); 

方程中阅读,然后把它变成一个C_STRING所以我可以看看输入的单个元素。

之后,我需要检查几件事情。如果元素是数字,我需要将它推到堆栈上。如果是空格,我需要跳过它。

if (isdigit(input[i])) 
{ 
    push(); 
    i++; 
} 
else if (isspace(input[i])) 
{ 
    i++; 
} 

现在是我卡住了。如果我碰到一个操作员(在这种情况下为*),我需要弹出堆栈顶部的两个元素并“操作它们”并将结果返回到堆栈。但是,我不知道任何能够让我认识到他们是经营者的事情。这可能是一个愚蠢的问题,但帮助将不胜感激。

+0

只是手边,你的输入是否保证被空白分开? – WhozCraig

+0

@WhozCraig Yessir,每个值之间总会有一个空格。 – ViscousRandom

+0

如果你输入包含多位数字:'12 321 + $'? – PiotrNycz

回答

0

只有大约4或5个操作员。检查它们是这样的:

if (input[i] == '*') {...} 
+2

我会用开关 –

+0

pfft。我会使用一个开关和strtok(),但是运行时库的可能性是相当有限的,因为它们的分配。然后再次,我看到isdigit(),isspace()等 – WhozCraig

0

那么,没有“内置”的方式。我只会写一个IsOperator(char ch)函数。然后这样做:

int IsOperator(char ch) 
{ 
    // either add more operators or use a table, etc. here 
    if (ch == '+' || ch == '-' || ch == '/' || ch == '*') 
     return 1; 

    return 0; 
} 

如果您拥有多焦运营商,像“==”,它变得有点复杂,因为你要偷看未来,但这个想法是一样的。

1

您可以创建一个功能map,并匹配运营商

std::map<char, void (*)(char *)> operators; 

operators['*'] = &mult; 
operators['+'] = &add; 
... 

,并在您conditionnal声明

if (isdigit(input[i])) 
    { 
     push(); 
     i++; 
    } 
else if (isspace(input[i])) 
    { 
     i++; 
    } 
else if (operators.find(input[i]) != operators.end()) 
    { 
     operators[input[i]](input); 
    } 

这样一来,你就可以轻松地添加新的运营商你的计算器。

0

如果您正在编写反转波兰符号计算器,那么在堆栈中您只有数字或数字,如您的示例中所示。顺便说一句,你不接受多位数字?

考虑两种情况,在这两个你只std::stack<int> numbers;需要:

  • 您有数字字符c - 堆栈只是把编号:

代码:

numbers,push(c - '0'); 
  • 你有运营商,比如说'+',你用他们的总和代替前两个数字:

代码:

if (numbers.size() < 2) { 
    throw std::runtime_error("Too little numbers for +"); 
} 
int a = numbers.top(); 
numbers.pop(); 
numbers.top() += a; 
  • 你有 '$',检查是否有只有一个堆栈数,其结果如下:

代码:

if (numbers.size() != 1) { 
    throw std::runtime_error("There should be only one!"); 
    } 
    int result = numbers.top(); 
    numbers.pop(); 
相关问题