Я уверен, что это задавали несколько раз, но другие вопросы, на которые я смотрел, не очень мне помогли. Итак, приступим: у меня есть три функции, одна из которых преобразует инфиксное выражение в постфиксное, другая — препроцессорная, а третья вычисляет постфиксное выражение. У меня проблемы с оценкой унарного отрицательного выражения. Если я вставлю весь свой код, он будет очень длинным, поэтому я опубликую только те части, которые касаются отрицательного/минусового регистра:
вот мой вывод: 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];
}
Я почти уверен, что какая бы ошибка я ни была сделана (или любое другое редактирование, которое мне нужно сделать), вероятно, это что-то действительно простое, чего я просто не вижу (потому что это обычно происходит со мной), но любой толчок в правильном направлении будет быть высоко оценен!
**Примечание: форматирование моего кода может быть неточным, поскольку я скопировал и вставил только те части, которые, по моему мнению, были уместны.