当前位置:网站首页>Detailed idea and code implementation of infix expression to suffix expression
Detailed idea and code implementation of infix expression to suffix expression
2022-07-06 19:09:00 【Wu Yu 4】
What is infix expression ?
Infix expression is a general expression of arithmetic or logic formula , Operators are in the middle of operands in the form of infixes (eg:3+4、3+4*2、8+(17-6*2)….).
Why do you want infix expression to suffix expression ?
But infix expressions are not easy to be processed by computers . We are calculating an equation ( Usually infix expression ) when , You need to convert infix expression into suffix expression .
What is a suffix expression ?
Then the suffix expression , Also known as reverse Polish , Does not contain brackets , The operator is placed after two operands , All calculations are in the order in which the operators appear , Strictly from left to right ( The precedence rules for operators are no longer considered ). Generally, stack is used to simulate .
How to convert infix expression into suffix expression ?
Take a simple chestnut :
(3+4)×5-2
Draw a tree like this :
So the suffix expression is :
3 4 + 5 × 2 -
The following is the idea of transformation :
1. Initialize two character array simulation stacks : Character storage stack s1 And a stack for storing intermediate results s2;
2. Scan infix expressions from left to right ;
3. When it comes to operands , Press it down s2;
4. When an operator is encountered , Compare it with s1 The priority of the top of stack operator :
If s1 It's empty , Or stack top operator is left bracket “(”, This operator will be put on the stack directly ;
otherwise , If the priority is higher than the top of the stack operator , Also push operators into s1;
otherwise , take s1 The operator at the top of the stack pops up and pushes into s2 in , Turn again ① And s1 Compared with the new stack top operators in ;
5. When brackets are encountered :
If it's left parenthesis “(”, Press in directly s1;
If it's right bracket “)”, Then it pops up in turn s1 The operator at the top of the stack , And press in s2, Until we meet the left bracket , This pair of parentheses is discarded ;
6. Repeat step 2 to 5, Up to the far right of the expression ;
7. take s1 The rest of the operators in the pop-up and press in s2;
8. Pop up one by one s2 And output , The reverse order of the result is the suffix expression corresponding to the infix expression
Then it can be calculated according to the suffix expression .
Be sure to pay attention to the calculation order of taking out elements ! The number taken out first is
XCount(X To reduce / except / Add / ride ), The number taken out after isByXCount!
Code ( There are detailed notes ):
#include<bits/stdc++.h>// Universal header file
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);// Accelerated statement
typedef long long ll;
const int N=1e5+10;
char s1[N],s2[N],s[N];
ll top1,top2,p,js[N],topis;
int lev(char n)
{
if(n=='+'||n=='-') return 1;
if(n=='*'||n=='/') return 2;
if(n=='^') return 3;
return 0;
}
void print()
{
for(int i=1;i<=topis;i++)// Currently being calculated
{
cout<<js[i]<<' ';
}
for(int i=p+1;i<=top2;i++)// Not traversed later
{
cout<<s2[i];
if(i!=top2)
cout<<" ";
}
if(p!=top2)
cout<<endl;
}
int main()
{
cin>>s;
for(int i=0;i<strlen(s);i++)
{
if(s[i]<='9'&&s[i]>='0')
{
s2[++top2]=s[i];
}
else
{
if(s[i]=='(')
{
s1[++top1]=s[i];
continue;
}
if(s1[top1]=='('||top1==0)
{
s1[++top1]=s[i];
continue;
}
if(lev(s1[top1])>=lev(s[i])&&s[i]!=')')// When it comes in, it's not the right bracket , And the incoming symbol priority has no s1 The stack top symbol of has high priority
// At this time, we need to s1 The top element of the stack is given to s2 in
{
s2[++top2]=s1[top1--];
while(lev(s1[top1])>=lev(s[i]))// If the priority level is still not as high as the symbol to enter , Continue to give s2 in
{
s2[++top2]=s1[top1--];
}
// At the end of the cycle , There is no symbol priority to enter s1 The stack top symbol of has high priority , You can deposit s1 in
s1[++top1]=s[i];
continue;
}
if(lev(s1[top1])<lev(s[i])&&s[i]!=')')
{
s1[++top1]=s[i];
}
if(s[i]==')')// Yes ' ) '
{
while(s1[top1]!='(')// take s1 The symbols in are given to s2 in , Until I met ' ) '
{
s2[++top2]=s1[top1--];
}
top1--;
continue;
}
}
}
while(top1>0)// if s1 And symbols , Need to give s2 in
{
s2[++top2]=s1[top1--];
}
for(int i=1;i<=top2;i++)
{
cout<<s2[i]<<" ";
}
cout<<endl;
// Perfect infix to suffix
// Next, calculate
for(int i=1;i<=top2;i++)
{
p=i;
if(s2[i]>='0'&&s2[i]<='9')
{
js[++topis]=s2[i]-'0';
}
else // For the sign , Operate on the two elements at the top of the stack , And store the results on the top of the stack
{
// Pay attention to the first digit of the advanced stack
if(s2[i]=='+')
{
ll x=js[topis];
ll y=js[--topis];
ll ans=y+x;
js[topis]=ans;
}
if(s2[i]=='-')
{
ll x=js[topis];
ll y=js[--topis];
ll ans=y-x;
js[topis]=ans;
}
if(s2[i]=='*')
{
ll x=js[topis];
ll y=js[--topis];
ll ans=y*x;
js[topis]=ans;
}
if(s2[i]=='/')
{
ll x=js[topis];
ll y=js[--topis];
ll ans=y/x;
js[topis]=ans;
}
if(s2[i]=='^')
{
ll x=js[topis];
ll y=js[--topis];
ll ans=pow(y,x);
js[topis]=ans;
}
print();// Print every step
}
}
return 0;
}
The operation results are as follows :

边栏推荐
- 提前解锁 2 大直播主题!今天手把手教你如何完成软件包集成?|第 29-30 期
- R language uses rchisq function to generate random numbers that conform to Chi square distribution, and uses plot function to visualize random numbers that conform to Chi square distribution
- AutoCAD - what is the default lineweight for centerline drawing and CAD? Can I modify it?
- AcWing 3537.树查找 完全二叉树
- 二叉搜索树
- R语言使用dt函数生成t分布密度函数数据、使用plot函数可视化t分布密度函数数据(t Distribution)
- How are you in the first half of the year occupied by the epidemic| Mid 2022 summary
- Airiot IOT platform enables the container industry to build [welding station information monitoring system]
- Word如何显示修改痕迹
- 渲大师携手向日葵,远控赋能云渲染及GPU算力服务
猜你喜欢

Take a look at how cabloyjs workflow engine implements activiti boundary events

Helm deploy etcd cluster

Intelligent supply chain management system solution for hardware and electromechanical industry: digital intelligent supply chain "creates new blood" for traditional industries

About NPM install error 1
受益匪浅,安卓面试问题

Xingnuochi technology's IPO was terminated: it was planned to raise 350million yuan, with an annual revenue of 367million yuan

关于npm install 报错问题 error 1

业务与应用同步发展:应用现代化的策略建议

同宇新材冲刺深交所:年营收9.47亿 张驰与苏世国为实控人

Nuc11 cheetah Canyon setting U disk startup
随机推荐
openmv4 学习笔记1----一键下载、图像处理背景知识、LAB亮度-对比度
Airiot IOT platform enables the container industry to build [welding station information monitoring system]
A wearable arm device for night and sleeveless blood pressure measurement [translation]
Multithreading Basics: basic concepts of threads and creation of threads
R语言ggplot2可视化:使用ggpubr包的ggdotplot函数可视化点阵图(dot plot)、设置palette参数设置不同水平点阵图数据点和箱图的颜色
Deep circulation network long-term blood pressure prediction [translation]
如何提高网站权重
MRO工业品企业采购系统:如何精细化采购协同管理?想要升级的工业品企业必看!
From 2022 to 2024, the list of cifar azrieli global scholars was announced, and 18 young scholars joined 6 research projects
wx小程序学习笔记day01
Wx applet learning notes day01
ORACLE进阶(四)表连接讲解
Pytorch common loss function
Interview assault 63: how to remove duplication in MySQL?
[paper notes] transunet: transformers make strongencoders for medical image segmentation
Solution of intelligent management platform for suppliers in hardware and electromechanical industry: optimize supply chain management and drive enterprise performance growth
Master Xuan joined hands with sunflower to remotely control enabling cloud rendering and GPU computing services
R language ggplot2 visualization: use ggviolin function of ggpubr package to visualize violin diagram
Tensorflow and torch code verify whether CUDA is successfully installed
Unlock 2 live broadcast themes in advance! Today, I will teach you how to complete software package integration Issues 29-30
