c - 实现 infixToPostfix 方法,但不知道为什么我第一次推送 '('

标签 c data-structures postfix-notation infix-notation

我还没有实现整个 infixTopostFix 方法。 但我对此有疑问。 我还在想办法。

(注意:我的 infixToPostfix 方法尚未完成)

#include <stdio.h>
#define SIZE 100

int top = -1;
char stack[SIZE];
void push(char data){

  if(top > SIZE-1)
    printf("full size\n");
  else{
    top = top + 1;
    stack[top] = data;
  }
}

char pop(){
  char data;
  if(top<0)
    printf("pop: empty!\n");
  else{
    data = stack[top--];
    return data;
  }
}

int is_operator(char symbol){

if(symbol == '^' || symbol == '*' || symbol == '/' || symbol == '+' || symbol == '-' || symbol == '')
  return 1;
else
  return 0'

}

int precedence(char symbol){
  if(symbol == '^'){
    return 3;
  }else if(symbol == '*' || symbol == '/'){
    return 2;
  }else if(symbol == '-' || symbol == ''){
    return 1;
  }else{
    return 0;
  }
}

现在,有一个 inFixToPostfix 方法。

int infixToPostfix(char exp[], char postix[]){
  int i, j;
  char data;
  char x;

我的问题是关于这部分的。 这个push方法(如下)有一个参数'('。这是push的第一个参数。 但我不明白为什么我应该先插入这个。

我的意思是..我可以看到这段代码的意思(此处的表达式)。 但我认为只是一个不带括号的表达式。

  push('(');
  strcat(exp, ')');

  i = 0; j = 0;
  data = exp[i];

  while(data != NULL){
    if(data == '('){
      push(data);
    }
    else if( isdigit(data) || isalpha(data)){
      postfix[j] = data;
      j++;
    }
    else if(is_operator(data) == 1){
      x = pop();

    }
  }
}

int main(void) {

  char exp[] = "(a+b)*3+(c-d)*2";
  char postfix[SIZE];
  // postfix: ab3+*cd2-*
  infixToPostfix(exp, postfix);
  puts(postfix);
  return 0;
}

最佳答案

请注意,任何数学表达式的计算结果都与括号内的表达式相同。我们通过使用 '(' 标记正在解析的表达式的开头来利用此属性。这允许算法在不使用特殊情况的情况下计算最终值。我建议您在让它工作后,删除插入括号的行,并使用示例输入单步执行代码。此练习将帮助您理解其目的。

关于c - 实现 infixToPostfix 方法,但不知道为什么我第一次推送 '(',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51006587/

相关文章:

C 将字符串文字与返回字符指针的函数进行比较

java - 是否有删除双向链表边的一半的名称?

arrays - ColdFusion 结构中的数组键

python - NumPy "record array"或 "structured array"或 "recarray"

java - j2me : Works only for single digit operands 中的算术表达式求值

c++ - 后缀评估

tree - 使用翻译方案进行 7-2+3 的后期修复表示法的可能树

c - 同一个管道的多个读取进程都可以读取同一条消息

c - 如何从日志文件获取数据插入 gtk 列表存储/ TreeView ?

C泛型编程