Преобразование префикса в постфикс с круглыми скобками

Я действительно застрял в преобразовании специального префикса в постфиксную операцию в нашей задаче, позвольте мне описать задачу аналогично:

У нас есть такая операция, чтобы использовать в качестве операций в наших префиксах, вот метод, который я проверяю их:

bool isOperator(string c)
{
    if (c == "log" || c == "exp" || c == "sum" || c == "div" || c == "abs" || c == "sqrt" || c == "sub" || c == "product" || c == "max" || c== "min" || c == "mod" )     // you may add operator here
        return true;
    return false;
}

В любом случае примерные инструкции префикса могут иметь круглые скобки, чтобы сделать приоритет операции, это то, что я застрял в. Я знаю, мне нужно реализовать такую ​​рекурсию, но я не могу найти способ.

div ( sqrt 5 ) 3

Выход должен быть

5 sqrt 3 div

Другой пример:

div ( sum ( exp 2 3 ) ( sqrt 5 ) ) 3

Выход

2 3 exp 5 sqrt sum 3 div

Каждая операция, скобки или число должны иметь пробел между элементами в предполагаемом состоянии.

Моя реализация стека

Stack.h

#include<iostream>
using namespace std;

struct node {
    string op ;
    node *next;
};

struct Stack {
    node * head;
    void create();
    void close();
    void push (node *);
    node* pop();
    node* top();
    bool isEmpty();

};

Stack.cpp

#define _CRT_SECURE_NO_WARNINGS
#include "stack.h"
#include <iostream>
#include <stdlib.h>

void Stack::create() {
    head = NULL;
}

void Stack::close() {
    node *p;
    while (head) {
        p = head;
        head = head->next;
        //delete [] p->data;
        delete p;
    }
}

void Stack::push(node *newdata) {
    node *newnode = new node;
    newnode = newdata;
    newnode->op = newdata->op;
    newnode->next = head;
    head = newnode;
}

node *Stack::pop() {
    if (isEmpty())
        return NULL;
    node *topnode = head;
    head = head->next;
    //delete topnode;
    return topnode;
}

node *Stack::top() {
    if (isEmpty())
        return NULL;
    node *topnode = head;
    //delete topnode;
    return topnode;
}
bool Stack::isEmpty() {
    return (head == NULL);
}

как упоминалось @PaulMcKenzie, я попробовал реализацию ниже, строковый массив sub_array содержит список слов без пробелов.

bool isLeftParanthesis(string c)
{
    if (c == "(" )   // you may add operator here
        return true;
    return false;
}
bool isRightParanthesis(string c)
{
    if (c == ")")    // you may add operator here
        return true;
    return false;
}
int main()
{
string prefix;
getline(cin, prefix);
istringstream iss(prefix);
istringstream iss2(prefix);
int count1 = 0, count2 = 0;
string postfix = "";
Stack *st = new Stack;
string t1, t2;

string sub;
string *sub_array;
while (iss >> sub) {
    count1++;
}
sub_array = new string[count1];
while (iss2 >> sub) {
    sub_array[count2] = sub;
    count2++;
}
int l = count1;

int right_p_count = 0;
for (int i = 0; i < count1; i++)
{
    if (isRightParanthesis(sub_array[i]))
    {
        right_p_count++;
    }
}
string *postfixes = new string[right_p_count];
int index_right_p = 0;
for (int i = 0; i < count1; i++) {
    while (!isRightParanthesis(sub_array[i]))
    {
        node *n = new node;
        n->op = sub_array[i];
        st->push(n);
        i++;
        if (i == count1)
        {
            break;
        }
    }
    if( i != count1){
    if (isRightParanthesis(sub_array[i])) {
        postfix = "";
        while (!isLeftParanthesis(st->top()->op))
        {
            string t = st->pop();
            if (!isOperator(t) && !isLeftParanthesis(t) && !isRightParanthesis(t)) {
                postfix = t + " " + postfix;
            }
            else if (isOperator(t)) {
                postfix = postfix + " " + t;
            }
        }
        st->pop();
        postfixes[index_right_p] = postfix;
        index_right_p++;
    }
    }
    postfix = "";
    while ( !st->isEmpty() && index_right_p == right_p_count && i == count1)
    {
        string t = st->pop();
        if (!isOperator(t) && !isLeftParanthesis(t) && !isRightParanthesis(t)) {
            postfix = t+" "+postfix;
        }
        else if (isOperator(t)) {
            postfix = postfix+""+t;
        }
        else {
            break;
        }
    }
}

string result = "";
for (int i = 0; i < right_p_count; i++)
{
    result = result + "" + postfixes[i];
}
result = result + " " + postfix;
cout << result << endl;
}

Постфиксный переменный относится к выходному постфиксу, но мой вывод не ошибочен для некоторых операций, таких как:

div ( sqrt 5 ) 3

Когда я вижу парантезы, я проверяю, левый или правый, используя правый для триггера.

abs ( product -2 -4 -8 )

Ожидаемый результат:

-2 -4 -8 product abs

ОБНОВЛЕНИЕ: Я решил проблему стека самостоятельно, но обнаружил, что алгоритм неправильно вычисляет некоторые выражения...

Пример выражения:

3 2 3 exp sum

Ожидаемый результат:

sum 3 ( exp 2 3 )

Мой вывод:

2 3 exp 3 sum

Мой алгоритм, использующий правильные скобки в качестве триггеров, вычисляет его неправильно, и я не знаю, как внедрить этот элемент управления в это, есть ли предложения?

0 ответов

Другие вопросы по тегам