简体   繁体   中英

Infix to postfix evaluating unary negative

I'm sure this has been asked a few times but the other questions I looked at didn't really help me much. Alright so here goes: I've got three functions one that converts an infix expression to a postfix, one that's a preprocessor and one that evaluates the postfix expression. What I'm having trouble with is evaluating a unary negative expression. If I put in my entire code it'll be super long so I'm only going to post up the parts that deal with the negative/minus case:

here's my output: input: -3
after preprocess: 3 postfix = -3 then a segmentation fault when it should output " 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;

I'm pretty sure the error is in that part of the function, I've been trying different things but nothing has been working, more times than not I get a segmentation fault or a zero. I originally tried to apply what I did in the infix2postfix expression (which obviously didn't work) But here's the rest of my code for the negative/minus case...

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];
        }

I'm almost certain that whatever error it is I made (or whatever edit I need to do) is probably something really simple that I just can't see (cause that's usually the case with me) but any nudge in the right direction would be highly appreciated!

**Note: the formatting of my code may not be accurate cause I only copied and pasted the parts I felt were relevant.

It seems to me like what is happening is that your code that evaluates the postfix expression, when it sees a minus sign, treats it as a subtraction. In particular, probably you push 3 onto the stack, and then encounter a minus sign: this triggers the code in the first block you posted, which tries to pop two elements off of the stack and subtract them. However there is only one element on the stack, namely the 3.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM