使用链表的 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 演示。
我明天要交作业,现在才开始。
我被要求使用链表做一个 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 演示。