1175 表达式

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值