Преобразование из постфикса в инфикс с использованием стеков
В настоящее время я работаю над проектом, конвертирующим из постфикса в инфикс с использованием стеков в виде связанных списков. В настоящее время я пытаюсь прочитать всю строку в виде строки, затем помещаю ее в массив символов, а затем, когда найден символ, помещаю один элемент в правый операнд, другой в левый операнд, а затем печатаю его обратно, включая оператор. однако после помещения первого элемента в левый операнд и последующего размещения в стеке я не могу поместить другой элемент в правый операнд. В чем может быть проблема? Я его с моей поп-функцией.
Вот мой код:
#include "stack.h"
stack::~stack()
{
cout<<"Inside !stack \n";
while(s_top != 0)
{
pop();
}
}
void stack::pop()
{
cout<<"Inside pop \n";
stack_node *p;
if (s_top != 0)
{
p = s_top;
s_top = s_top->next;
delete p;
}
}
void stack::push(char a)
{
cout<<"Inside push \n";
stack_node *p = new stack_node;
p->data = a;
p->next = s_top;
s_top = p;
}
void stack::print()
{
cout<<"Inside print \n";
for(stack_node *p = s_top; p!=0; p=p->next)
{
cout<<p->data<<endl;
}
}
stack_element stack::top()
{
cout<<"Inside top \n";
if (s_top == 0)
{
exit(1);
}
else
{
return s_top->data;
}
}
/*stack::stack(const stack & Org)
{
cout<<"Inside the Copy Constructor\n";
stack_node *p=Org.s_top;
(*this).s_top = 0;
while(p!=0)
{
(*this).push(p->data);
p=p->next;
}
}
и вот мой CPP, где он не работает полностью
#include "stack.h"
string convert(string expression){
stack c;
string post = " ";
string rightop="";
string leftop="";
string op =" ";
for (int i =0; i<expression.length();i++){
c.push(expression[i]);
if(expression[i]=='*'||'+'||'-'||'/'){
cout<<c.top()<<endl;
leftop=c.top();
c.pop();
rightop=c.top();
cout<<rightop<<endl;
c.pop();
op=c.top();
c.pop();
}
}
}
int main(){
string expression;
cout<<" Enter a Post Fix expression: ";
getline(cin,expression);
convert(expression);
return 0;
}
1 ответ
Вот проблема:(expression[i]=='*'||'+'||'-'||'/'
Это не делает то, что вы думаете, что делает.
Исправление:
(expression[i] == '*' ||
expression[i] == '+' ||
expression[i] == '-' ||
expression[i] == '/')
Редактировать 1: Поиск строк
Другой метод:
char c = expression[i];
const std::string operators="*+-/";
if (operators.find(c) != std::string::npos)
{
// expression[i] is an operator character
}
Обычно выкладываемое решение заключается в использовании switch
:
switch (expression[i])
{
case '+': Process_Operator_Plus(); break;
case '-': Process_Operator_Minus(); break;
case '*': Process_Operator_Multiply(); break;
case '/': Process_Operator_Divide(); break;
}
Помните, вам нужно будет обрабатывать приоритет операторов при оценке выражений.