使用链表的 C 编程中的 RPN 计算器

RPN calculator in C programming using Linked Lists

我明天要交作业,现在才开始。

我被要求使用链表做一个 RPN 计算器。

我的想法是我必须编写一个输入字符串,例如 (25 35 +),并使用链表显示结果。

使用的结构是

typedef struct {
int data;
struct cell *next;}cell;

typedef struct {
int positif;
struct cell *datas;
int ref;} num ;

在上面的示例中,当我写 25 35 + 时,我必须将 25 作为一个数字存储并将其压入堆栈,对 35 执行相同的操作,当读取运算符时,我这样做调用 2 个 pops 的操作。

问题是当它读取 space.

时,我不知道如何将数字与字符串分开

这是我的主要

 char strIn[250];
num *lenumero = initialisation(); 
printf(">");                      
scanf("%s", &strIn);               

int i=0;
while(strIn[i] != '[=12=]')
{
    /*Here I want to write the code that reads the string untill it finds a space , 

然后它将 space 之前的数字压入堆栈!

}

例如 StrIn[0]=2 STrIn[1]=5 strIn[2]=(space) 所以我将2放入一个cell->data,5放入cell->next->data,然后我将所有的cell放入结构编号使用的cell,并将结构编号压入堆栈。

谢谢

我假设这是一个 C 赋值,而不是 C++。

对于波兰语表示法,您不需要括号。可能最简单的方法是使用 strtok() 将输入字符串分成 space 分隔的标记,而不仅仅是检查标记是否等于“+”、“-”、“/”或“*”。如果不是,则将其作为整数读取(例如使用 sscanf)并作为数字推送。否则,推送为操作。

如 SergeyA 的回答中所述,您可以使用带有白色 space 的 strtok 作为分隔符。

pointer = strtok(strIn, " ");
while(pointer != NULL) {
  printf("%s\n", pointer); // this is where you put your logic to push the number to the stack.
  pointer = strtok(NULL, " ");
}

如果你想测试它是否是一个运算符(即任何“+-/*”),你可以使用 strchr

const char *operators = "+-/*";
...
char *c = pointer;
if(strchr(operators, *c)) {
  printf("%c is in \"%s\"\n", *c, operators); // replace this with your logic to read from the stack and calculate the numbers with the given operator.
}else {
  while(*c) {
    printf("%c\n", *c); // this will print all the digits of the numbers
    c++;
  }
}
...

您的代码现在的问题是您使用的 scanf("%s", strIn); 只会读取第一个字符串,直到 space。你应该做的是使用 fgets 代替。

fgets(strIn, 25, stdin);

这是一个 live 演示。