Я действительно застрял в преобразовании специального префикса в постфиксную операцию в нашей задаче, позвольте мне описать задачу аналогично:
У нас есть такая операция, чтобы использовать в качестве операций в наших префиксах, вот метод, который я проверяю их:
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
Мой алгоритм, использующий правильные скобки в качестве триггеров, вычисляет его неправильно, и я не знаю, как внедрить этот элемент управления в это, есть ли предложения?
Задача ещё не решена.
Других решений пока нет …