1175 表达式
这个题好想很好玩的样子,就是一个模拟栈,只不过需要把每一步都得输出,很麻烦
所以这个题就要做两个模板:
1.给定一个中缀表达式,我们需要将其转化成后缀表达式
2.输出每一步骤(后置表达式)的计算过程
这个题好变态啊感觉,需要用到一系列的操作,不过这个简单的地方就在于纯模拟,尽管变态但并不琐碎
YI:中缀转成后缀,通过笔计算,我们大家都会,但是将这个过程转化到计算机里,那就非常复杂了
首先,我们要从头到尾扫描表达式每一个数,如果是数字就输出到后缀;如果不是数字就判断是不是右括号,如果是看一下栈顶是不是左括号,一只弹出到后缀中,知道找到为止
写到这里我感觉这个题好熟悉
我太喜欢了
这个题有一种似曾相识的感觉
碰到左括号,直接入栈
碰到右括号,不断弹出栈顶直到碰到左括号
这个思路很明显了
这就是一个结果
isdigit这个函数就是来判断这个字符是否为数字
-------重新-----*----
输入一个中缀
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<list>
#include<stack>
using namespace std;
inline void printt(const string& s)//先输出
{
for (int i = 0; i < s.size(); i ++)
cout << s[i] << ' ';
cout << endl;
}
inline int fprint(const int& a, const int& b, const int& mark) //计算结果
{
switch(mark)
{
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
case '^':
return (int)pow(a, b);
}
}
inline int grade(const char &ch)//计算符号优先级,运用到switch的常识
{
switch(ch)
{
case'+':case'-':return 1;
case'*':case'/' :return 2;
case'^': return 3;
case'(':case')': return 0;
}
}
inline string change(const string &s)//中缀表达式转化成后表达式
{
string hou="";//后缀表达式
stack<char> st;//中转栈
for(int i=0;i<s.size();i++)//枚举每一个元素
{
if(isdigit(s[i]))//判断是否是数字
{
hou+=s[i];//连接到后缀表达式中
}
else if(s[i]=='(') st.push(s[i]);//左括号
else if(s[i]==')') //右括号不断弹出
{
while(st.top()!='(')
hou+=st.top(),st.pop();
st.pop();//弹出左括号
}
else//处理运算符
{
while(!st.empty()&&grade(st.top())>=grade(s[i]))//判断优先级
hou+=st.top(),st.pop();
st.push(s[i]);
}
}
while(!st.empty())
hou+=st.top(),st.pop();
return hou;
}
inline void write(const string& s)
{
list<int> st;
printt(s);//先输出表达式,然后接着进行计算
for (int i = 0; i < s.size(); i ++)
{
if (isdigit(s[i]))
{ // 如果遇到数字直接压入栈
st.push_back(s[i] - '0');
}
else
{ // 否则计算结果并压入栈
int a, b; //取出栈顶的两个元素
a = st.back();
st.pop_back();
b = st.back();
st.pop_back();
st.push_back(fprint(b, a, s[i])); // 注意计算顺序
for (list<int>::iterator it = st.begin(); it != st.end(); ++it)
cout << *it << ' '; // 输出栈中已计算过的数
for (register int j = i + 1; j < s.size(); j ++)
cout << s[j] << ' '; // 再输出还未计算过的数
cout << endl;
}
}
}
int main()
{
string s;
cin>>s;
write(change(s));
return 0;
}