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