C中的后缀评估

时间:2011-11-12 17:28:23

标签: c postfix-notation

我正在参加C课程,我们必须为经典的Postfix评估问题制作一个程序。现在,我已经在java中完成了这个问题,所以我知道我们必须使用堆栈将数字推入,然后在我们得到一个运算符时弹出它们,我想我对所有这些东西都很好。我遇到的问题是在C中扫描后缀表达式。在java中它更容易,因为你可以使用charAt,你可以使用parseInt命令。但是,我不知道C中有任何类似的命令。所以任何人都可以解释一种方法来从表单中读取每个值:

4 9 * 0 - =

其中equals是输入结束的信号。

非常感谢任何帮助,并提前感谢您:)

3 个答案:

答案 0 :(得分:1)

假设你输入的是一个字符数组。

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

您可以通过访问每个单独的数组元素来访问单个字符

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

或者您可以使用指针算法并从输入中的不同点进行解析(请记住{sscanf'的原型#include <stdio.h>

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

或者,正如Chris Lutz在评论中所建议的那样,使用strtol(在适当的#include <stdlib.h>之后)

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 :(得分:0)

C字符串是字符数组:char[]char*。 你可以使用for循环来迭代它并通过它的索引得到每个字符:

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
}

答案 2 :(得分: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