2011-11-12 56 views
0

我正在參加C課程,我們必須爲經典的Postfix評估問題編寫一個程序。現在,我已經在java中完成了這個問題,所以我知道我們必須使用堆棧來推動數字,然後在我們獲得操作員時彈出它們,我認爲我對所有這些東西都很好。我遇到的問題是在C中掃描後綴表達式。在java中它更容易,因爲你可以使用charAt並且可以使用parseInt命令。但是,我不知道在C.任何類似的命令,所以任何人都可以解釋的方法,從形式的字符串讀取每個值:C中的postfix評估

4 9 * 0 - =

凡平等是輸入結束的信號。

任何幫助將不勝感激,謝謝你提前:)

+0

可能重複(http://stackoverflow.com/questions/8112140/postfix-evaulation-using-stacks-and-c) –

回答

1

假設您輸入的字符數組。

char input[] = "4 9 * 0 - ="; 

可以通過訪問每個單獨陣列元件

if (input[4] == '*') /* deal with star */; 

訪問單個字符,也可以使用指針運算並解析從輸入中的不同點(記得#include <stdio.h>爲原型`的sscanf ')

if (sscanf(input + 2, "%d", &number) != 1) /* deal with error */; 

或者,由克里斯·盧茨在評論所說,使用strtol(正確後)

number = strtol(input + 2, &next, 10); 
/* don't forget to check for errors! */ 
/* `next` now points to the character after the `long` at position 2 in the array */ 
+1

相反,在這裏使用'srtol'而不是'sscanf'。 'strtol'將有助於推動字符串。 –

+0

+1 Chris:通過增加「strtol」選項編輯回答。謝謝。 – pmg

0

C字符串是字符的數組:char[]char*。 你可以使用一個for循環迭代它和它的指數得到每個characher:

for (int i = 0; i < strlen(yourString); i++) 
{ 
    char ch = yourString[i]; 
    // ... 
} 

也有一個功能,strtok()可能會有所幫助這裏令牌化的字符串:

#include <string.h> 
#define NULL (void*)0 

char yourString[] = "4 9 * 0 - ="; 
char delimiters[] = " "; // could be " +*/-=" depending on your implementation 
char *token = NULL; 
token = strtok(yourString, delimiters); 
while(token != NULL) 
{ 
    printf("current token is: %s\n", token); 
    // do what ever you want with the token 
    token = strtok(NULL, delimiters); // next token 
} 
0

你也可以用sscanf知道有多少項目已被讀取(讀取的數據項目的計數器是sscanf的結果)以及相對位置(使用%n格式說明符)是什麼。

,所以你也可以代碼

int pos = 0; 
int endpos = 0; 
int val = 0; 
if (sscanf(input + pos, "%d %n", &val, &endpos) >= 1) { 
    // val has been read as an integer, handle it 
    stack[top++] = val; 
    pos += endpos; // skip to next token in input 
} 

還有很多這樣做的方式。您可能需要閱讀有關lexersparsers的信息,例如與flexbison,或antlr

[後綴計算結果爲使用棧和C]的