C++中缀表达式转后缀表达式

C++中缀表达式转后缀表达式

最近在看计算器相关的东西,然后想自己实现一下简单的中缀表达式转后缀表达式。

环境Visual Studio 2017->c++控制台项目
本文仅实现中缀表达式转后缀表达式,(中缀转后缀以及)后缀表达式计算,请点击下面的链接:
后缀表达式计算

1. 栈内外元素优先级

isp栈内元素优先级(in stack priority)
icp栈外元素优先级(in coming priority)
在这里插入图片描述

2.算法思想

(1)初始化栈,将结束符‘#’入栈,在输入字符串末尾添加’#’。
(2)若是数字,将获取整个数字串,然后直接输出到队列(string)q中
否则将栈顶元素s.top()与栈外元素(string)intput[i]的优先级做比较
·1·若isp(s.top()) > icp(input[i]),栈内优先级高,则出栈,压入输出队列q。
此时
需将栈内所有优先级比栈外元素优先级高的元素出栈,并压入输出队列q中,直到优先等级是<=。再重新执行<或=操作。
·2·若isp(s.top()) < icp(input[i]),栈外元素优先级高,则进栈
·3·若isp(s.top()) = icp(input[i]),栈内外优先级相等,则出栈。
(3)直至input中所有元素被读取完,也就是栈内的#与input的#匹配,此时队列q中的元素输出即为所求后缀表达式。

3.代码实现

#include <iostream>
#include<string>
#include <stack>
#include <queue>
using namespace std;

stack<char> s;//存放运算符的栈
queue<string> q;//输出队列(用于计算后缀表达式)
stack<double> sum;//用于计算后缀表达式(本文未实现计算后缀表达式)
string str = "";//读取整个数字串并保存

int isp(char c)//栈内元素优先级判断
{
 switch (c)
 {
 case '#':
  return 0;
 case '(':
  return 1;
 case '+':
 case '-':
  return 3;
 case '*':
 case '/':
 case '%':
  return 5;
 case ')':
  return 6;
 }
}
int icp(char c)//栈外元素优先级判断
{
 switch (c) {
 case '#':
  return 0;
 case ')':
  return 1;
 case '+':
 case '-':
  return 2;
 case '*':
 case '/':
 case '%':
  return 4;
 case '(':
  return 6;
 }
}
void postfix(string input)//中缀表达式转后缀表达式代码
{
	s.push('#');//将#压入栈顶
 input += '#';//添加#号作为结束符
 for (int i = 0; i < input.length(); i++)
 {
  if ((input[i] >= '0' && input[i] <= '9') || input[i] == '.')
  {
   str += input[i];
  }
  else
  {
   if (str.length() > 0)//将数放入直接输出到队列中
   {
    q.push(str);
    str = "";
   }
   while (isp(s.top()) > icp(input[i]))
   {
    string a;//因为不能直接在栈和队列间转换字符和字符串类型,所以先将字符转成 字符串再出栈进队列
    a = s.top();
    q.push(a);
    s.pop();
   }
   //判断站外元素优先级决定元素是应该去除(=),还是进栈(<)
   if (isp(s.top()) == icp(input[i]))
   {
    s.pop();
   }
   else
   {
    s.push(input[i]);
   }
  }
 }
}


int main()
{
 string input;
 string och;
 cin >> input;
 postfix(input);
 while (q.empty() == false)//队列不为空则输出队列元素
 {
  och=q.front();
  cout << och ;
  q.pop();
 }
}

实验结果

输入:(5-8*(8-7))*9
输出:结果没问题,输入的时候不要将括号打成中文。
在这里插入图片描述

本文参照
数据结构:用于面向对象方法与C++语言描述/殷人昆主编。 —2版(第99页)

寄语

有什么问题可以评论区交流,写了也不一定回,回了也不一定对,对了也不一定能用,能用了也不一定能对。。。。。。。

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值