您的位置:首页 > 编程语言 > C语言/C++

中缀转前缀 c语言

2016-03-06 00:30 531 查看
今天写后缀表达式转中缀表达式卡了好久,最后去上网问了才会,思路很清晰但是代码的组织能力欠缺。看来我也是那种伪代码写的对,代码通不过的选手。

写个普通的中缀转前缀吧,算法都是死的,就那么几步,我还调试了半天,不过对优先级的理解倒是透彻了(isp 和 icp)

利用栈将中缀表达式转成前缀表达式的思路:

1)求输入串的逆序。

2)检查输入的下一元素。

3)假如是操作数,把它添加到输出串中。

4)假如是闭括号,将它压栈。

5)假如是运算符,则

i)假如栈空,此运算符入栈。

ii)假如栈顶是闭括号,此运算符入栈。

iii)假如它的优先级高于或等于栈顶运算符,此运算符入栈。

iv)否则,栈顶运算符出栈并添加到输出串中,重复步骤5。

6)假如是开括号,栈中运算符逐个出栈并输出,直到遇到闭括号。闭括号出栈并丢弃。

7)假如输入还未完毕,跳转到步骤2。

8)假如输入完毕,栈中剩余的所有操作符出栈并加到输出串中。

9)求输出串的逆序。

#include<iostream>
#include<vector>
#include<stack>
using namespace std;

// in_stack precedence
int isp(char op)
{
switch (op)
{
case '!':
return 1;
break;
case '*':
case '/':
case '%':
return 2;
break;
case '+':
case '-':
return 3;
break;
case '<':
case '>':
return 4;
break;
case '(':
return 8;
break;
case '#':
return 0;
break;
}
}

// incoming precedence
int icp(char op)
{
switch (op)
{
case '!':
return 1;
break;
case '*':
case '/':
case '%':
return 2;
break;
case '+':
case '-':
return 3;
break;
case '<':
case '>':
return 4;
break;
case '(':
return 0;
break;
case '#':
return 0;
break;
}
}

//回到正题,中缀转前缀
void iTwof(string e)
{
vector<char> stack;
vector<char> result;
for (int i = e.size()-1; i >= 0; i--)
{
if (!e.empty() && e[i] >= '0' && e[i] <= '9')
{
result.push_back(e[i]);
}
else if (!e.empty() && e[i] == ')')
{
stack.push_back(e[i]);
}
else if (!e.empty() && e[i] == '(')
{
while (!stack.empty() && *(stack.end() - 1) != ')')
{
result.push_back(*(stack.end() - 1));
stack.pop_back();
}
stack.pop_back();
}
else
{
if (stack.empty() || isp(*(stack.end() - 1)) >= icp(e[i]))
{
stack.push_back(e[i]);
}
else
{
while (!stack.empty() && isp(*(stack.end()-1) != icp(e[i])))
{
result.push_back(*(stack.end() - 1));
stack.pop_back();
}
}
}
}
while (!stack.empty())
{
result.push_back(*(stack.end() - 1));
stack.pop_back();
}
while (!result.empty())
{
cout << *(result.end() - 1);
result.pop_back();
}
cout << endl;
}

int main(void)
{
<pre name="code" class="cpp" style="color: rgb(51, 51, 51); font-size: 14px; line-height: 24px;">        iTwof<span style="font-family: Helvetica, Tahoma, Arial, sans-serif;">("4*3/(7-2)+6"); // +/*43-726</span>
return 0;}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: