2012-10-03 111 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(); 
相關問題