Инфикс к постфиксу, оценивающему унарный отрицательный

Я уверен, что это задавали несколько раз, но другие вопросы, на которые я смотрел, не очень мне помогли. Итак, приступим: у меня есть три функции, одна из которых преобразует инфиксное выражение в постфиксное, другая — препроцессорная, а третья вычисляет постфиксное выражение. У меня проблемы с оценкой унарного отрицательного выражения. Если я вставлю весь свой код, он будет очень длинным, поэтому я опубликую только те части, которые касаются отрицательного/минусового регистра:

вот мой вывод: input: -3
после предварительной обработки: 3 postfix = -3 затем ошибка сегментации, когда он должен выводить " total = -3 "

#include "postfix.h"
#include "stack.h"
#include <cstdlib>
#include <cmath>
#include <cstdio>

void eval_postfix(char* postfix){
  Stack<double> stack;
  char fchar[100];
  int j=0;
  double a, b, convert, total = 0.0;
  for(int i=0; postfix[i] != '\0'; i++){
    switch(postfix[i]){
    case '-':
      a = stack.top();
      stack.pop();
      b = stack.top();
      stack.pop();
      total = b-a;
      stack.push(total);
      break;

Я почти уверен, что ошибка в этой части функции, я пробовал разные вещи, но ничего не работало, чаще, чем нет, я получаю ошибку сегментации или ноль. Первоначально я пытался применить то, что я сделал в выражении infix2postfix (что, очевидно, не сработало). Но вот остальная часть моего кода для отрицательного/минусового случая...

void infix2postfix(char* infix, char* postfix){
  Stack<char> stack;
  stack.push('\0');
  int pc = 0;
  bool c;
  for(unsigned int i = 0; infix[i] != '\0'; i++){
    //use the switch method to define what to do for each of the operators
    switch(infix[i]){
 case '-':
      c = 0;
      //unary negative
      if(i==0){
    postfix[pc++] = infix[i];
    c = 1;
      }
      else if((infix[i-1] == '*' ||
           infix[i-1] == '^' ||
           infix[i-1] == '*'  ||
           infix[i-1] == '/'  ||
           infix[i-1] == '+' ||
           infix[i-1] == '-')&& 
          i>0){
    postfix[pc++]= infix[i];
    c=1;
      }
      else{
    if(stack.top() == '*' || stack.top() == '/' || stack.top() == '^'){
      while(stack.top() != '\0' && stack.top() != '('){
        postfix[pc++] = stack.top();
        postfix[pc++] = ' ';
        stack.pop();
      }
    }
      }
      if (c==0)
    stack.push('-');
      break;

void preprocessor(char* input){
      char output[100];
      int oc = 0;
      for(unsigned int i=0; input[i] != '\0'; i++){
        if((input[i] == '-' && (input[i-1] == '*' || input[i-1] == '^' || input[i-1] == '*'
                    || input[i-1] == '/' || input[i-1] == '+' || input[i-1] == '-')
        && i>0)){
          //output[oc++] = '0';
          output[oc++] = input[i];
        }

Я почти уверен, что какая бы ошибка я ни была сделана (или любое другое редактирование, которое мне нужно сделать), вероятно, это что-то действительно простое, чего я просто не вижу (потому что это обычно происходит со мной), но любой толчок в правильном направлении будет быть высоко оценен!

**Примечание: форматирование моего кода может быть неточным, поскольку я скопировал и вставил только те части, которые, по моему мнению, были уместны.


person Sabrina Kreip    schedule 04.12.2013    source источник


Ответы (1)


Мне кажется, что происходит то, что ваш код, который оценивает постфиксное выражение, когда он видит знак минус, обрабатывает его как вычитание. В частности, возможно, вы помещаете 3 в стек, а затем сталкиваетесь со знаком минус: это запускает код в первом опубликованном вами блоке, который пытается извлечь два элемента из стека и вычесть их. Однако в стеке есть только один элемент, а именно 3.

person Andrey Mishchenko    schedule 04.12.2013