О c ++ конвертировать инфикс в постфикс, когда он содержит два знака мощности (^^) - PullRequest
0 голосов
/ 20 ноября 2018

Моя цель - преобразовать инфиксное выражение в постфиксное выражение.

У меня проблема с этой строкой:

while(precedence(stack[top])>=precedence(symbol)) 

Условие выполнено (и должно выполняться), когда оно выполнено++ или ** или / или --, потому что он проверяет слева, но в случае мощности (^) он начинается справа.Я не хочу входить в этот цикл, если он удвоен (^^).

в простом в то время как (приоритет (стек [верх])> = приоритет (символ)), если оператор сверху (()) и оператор в символе (^) Я не хочу вводить цикл whileЯ сниму это дело, потому что это неправильно, но я не знала как.

C ++:

#include<iostream>
#include<stdio.h>

using namespace std;#
define size 100

int temp, length = 0, inx = 0, pos = 0, top = -1;
char symbol, infix[size], postfix[size], stack[size];
void push(char);
char pop();
int precedence(char);
void infix_to_postfix(char[]);

void push(char symbol) {
    if (top >= size - 1) {
        cout << "stack is over flow push not possible" << endl;
    } else {
        top = top + 1;
        stack[top] = symbol;
    }
}

char pop() {
    temp = stack[top];
    top = top - 1;
    return temp;
}

int precedence(char symbol) {
    int priority = 0;
    switch (symbol) {
    case '+':
    case '-':
        priority = 1;
        break;

    case '*':
    case '/':
        priority = 2;
        break;
    case '^':
        priority = 3;
        break;
    } //end of switch()
    return priority;
} //end of precedence()

void infix_to_postfix(char infix[]) {
    while (infix[inx] != '\0') {
        symbol = infix[inx++];
        switch (symbol) {
        case '(':
            push(symbol);
            break;
        case ')':
            temp = pop();
            while (temp != '(') {
                postfix[pos++] = temp;
                temp = pop();
            }
            break;
        case '-':
        case '+':
        case '*':
        case '/':
        case '^':
            while (precedence(stack[top]) >= precedence(symbol)) {
                temp = pop();
                postfix[pos++] = temp;
            }
            push(symbol);
            break;
        default:
            postfix[pos++] = symbol;
            break;
        }
    }

    while (top > -1) {
        temp = pop();
        postfix[pos++] = temp;
        postfix[pos] = '\0';
    }
}

int main() {
    cout << "\nEnter an infix expression:\n";
    cin >> infix;
    infix_to_postfix(infix);
    cout << "\nThe equivalent postfix expression:\n";;
    cout << postfix << endl;;
    return 0;
}

1 Ответ

0 голосов
/ 20 ноября 2018

в простом в то время как (приоритет (стек [верх])> = приоритет (символ)), если оператор сверху - (^), а оператор в символе (^). Я не хочу вводить цикл while

Использование

while (precedence(stack[top]) >= precedence(symbol) && stack[top] != '^' && symbol != '^')

Добавление && к вашему условию заставит его проверить, что и оператор в верхней части стека, и символ не '^'.

Вы также можете сделать

// ...

case '^':
    if (stack[top] != '^' && symbol != '^')
        while(precedence(stack[top])>=precedence(symbol))
        {
            temp=pop();
            postfix[pos++]=temp;
        }

    // ...
...