1、中缀表达式求值
输入:
2+2=
20*(4.5-3)=
0
#include <iostream>
#include<cmath>
#include <iomanip>
#define MAXSIZE 1000
using namespace std;
char op[7] = { '+', '-', '*', '/', '(', ')', '=' };
typedef struct
{
char *base;
char *top;
int stacksize;
}SqStackOPTR;
typedef struct
{
double *base;
double *top;
int stacksize;
}SqStackOPND;
int InitStack(SqStackOPTR &S)
{
S.base=new char [MAXSIZE];
if(!S.base) return 0;
S.top=S.base;
S.stacksize=MAXSIZE;
return 1;
}
int InitStack(SqStackOPND &S)
{
S.base=new double [MAXSIZE];
if(!S.base) return 0;
S.top=S.base;
S.stacksize=MAXSIZE;
return 1;
}
int Push(SqStackOPTR &S,char e)
{
if(S.top-S.base==S.stacksize) return 0;
*S.top=e;
S.top++;
return 1;
}
int Push(SqStackOPND &S,double e)
{
if(S.top-S.base==S.stacksize) return 0;
*S.top=e;
S.top++;
return 1;
}
double GetTop(SqStackOPND S)
{
if(S.top!=S.base)
return *(S.top-1);
}
char GetTop(SqStackOPTR S)
{
if(S.top!=S.base)
return *(S.top-1);
}
int Pop(SqStackOPTR &S,char &e)
{
if(S.top==S.base) return 0;
S.top--;
e=*S.top;
return 1;
}
int Pop(SqStackOPND &S,double &e)
{
if(S.top==S.base) return 0;
S.top--;
e=*S.top;
return 1;
}
int In(char ch) {//判断ch是否为运算符
for (int i = 0; i < 7; i++) {
if (ch == op[i]) {
return 1;
}
}
return 0;
}
char Precede(char c1, char c2)
{
if((c1=='('&&c2==')')||(c1=='='&&c2=='=') )return '=';
else
if(((c1=='+'||c1=='-'||c1=='*'||c1=='/'||c1==')') && (c2=='+'||c2=='-'||c2==')'||c2=='='))||((c1=='*'||c1=='/'||c1==')')&&(c2=='*'||c2=='/')))return '>';
else
if(((c1=='('||c1=='=')&&c2!=')'&&c2!='=')|| ((c1=='+'||c1=='-')&&(c2=='*'||c2=='/'))||c1=='('||c2=='(') return '<';
else
cout<<c1<<" "<<c2<<"没有输出"<<endl;
}
double Operate(double first, char theta, double second) {//计算两数运算结果
switch (theta) {
case '+':
return first + second;
case '-':
return first - second;
case '*':
return first * second;
case '/':
return first / second;
}
return 0;
}
double EvaluateExpression(char ch) {//算术表达式求值的算符优先算法,设OPTR和OPND分别为运算符栈和操作数栈
SqStackOPTR OPTR;
SqStackOPND OPND;
char theta;double a, b;char x, top;
InitStack(OPTR);
InitStack(OPND);
Push(OPTR, '=');
//cout<<"此时ch为:"<<ch<<endl;
while (ch != '=' || (GetTop(OPTR) != '=')) //表达式没有扫描完毕或OPTR的栈顶元素不为“=”
{
char sign='+';
if(ch=='-')
{
sign=ch;
}
if(!In(ch))//不是运算符则解析数字字符串然后进操作数栈
{
double m=0,n=0;
while(ch!='.'&&ch>='0'&&ch<='9')
{//解析整数部分
m=m*10+(ch-48);
cin >> ch;
}
if(ch=='.')//解析小数部分
cin >> ch;
int k=1;
while(ch>='0'&&ch<='9')
{
n=n+(ch-48)*pow(10.0,-k);
k++;
cin>>ch;
}
// cout<<"此时ch为:"<<ch<<endl;
// cout<<"数解析为:"<<m+n<<endl;
if(sign=='-')
{
Push(OPND,-(m+n));
// cout<<"进栈:" <<-(m+n)<<endl;
}
else
{
Push(OPND,m+n);
// cout<<"进栈:" <<m+n<<endl;
}
// cout<<"此时ch为:"<<ch<<endl;
// cout<<"此时栈顶元素为"<<GetTop(OPTR)<<endl;
}//while 解析第一个数,整合整数部分和小数部分并将其压入栈
else//如果不是数,则比较运算符优先级
switch (Precede(GetTop(OPTR), ch)) //比较OPTR的栈顶元素和ch的优先级
{
case '<'://还暂时不用对数栈运算
// cout<<GetTop(OPTR)<<"<"<<ch<<endl;
Push(OPTR, ch);
// cout<<"进栈:" <<ch<<endl;
cin >> ch; //当前字符ch压入OPTR栈,读入下一字符ch
// cout<<"此时ch为:"<<ch<<endl;
break;
case '>'://弹出该运算符并弹出两个数,进行运算
// cout<<GetTop(OPTR)<<">"<<ch<<endl;
Pop(OPTR, theta); //弹出OPTR栈顶的运算符
Pop(OPND, b);
Pop(OPND, a); //弹出OPND栈顶的两个运算数
// cout<<"出栈:" <<b<<theta<<a<<endl;
Push(OPND, Operate(a, theta, b)); //将运算结果压入OPND栈
//cout<<a<<theta<<b<<":"<<Operate(a, theta, b)<<endl;
//cout<<"进栈:" <<Operate(a, theta, b)<<endl;
break;
case '=': //OPTR的栈顶元素是“(”且ch是“)”,括号内容已经运算完毕,现在去括号
//cout<<GetTop(OPTR)<<"="<<ch<<endl;
Pop(OPTR, x);
//cout<<"出栈:" <<x<<endl;
cin >> ch; //弹出OPTR栈顶的“(”,读入下一字符ch
//cout<<"此时ch为:"<<ch<<endl;
break;
} //switch
} //while
//cout<<"GetTop(OPND);"<<GetTop(OPND)<<endl;
return GetTop(OPND); //OPND栈顶元素即为表达式求值结果
}
int main()
{
while (1)
{
char ch;
cin >> ch;
//cout << "请输入要计算的表达式" << endl;
if(ch=='=')break;
double res = EvaluateExpression(ch);//算法3.22 表达式求值
cout <<setiosflags(ios::fixed)<<setprecision(2)<< res <<endl;
}
return 0;
}
2、后缀:
#include<bits/stdc++.h>
using namespace std;
char s1[100010],s2[100010],s3[100010],a[100010];
long long top2,top1,p;
long long js[100010],topjs;
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<=topjs;i++)
{
cout<<js[i]<<" ";
}
for(int i=p+1;i<=top2;i++)
{
cout<<s2[i];
if(i!=top2)
cout<<" ";
}
if(p!=top2)
cout<<endl;
}
int main()
{
long long n;
scanf("%s",a);
n=strlen(a);//???gets()
for(int i=0;i<n;i++)
{
if(a[i]>='0'&&a[i]<='9')
{
s2[++top2]=a[i];
}
else
{
if(a[i]=='(')
{
s1[++top1]=a[i];
continue;
}
if(s1[top1]=='('||top1==0)
{
s1[++top1]=a[i];
continue;
}
if(lev(s1[top1])>=lev(a[i])&&a[i]!=')')
{
s2[++top2]=s1[top1--];
while(lev(s1[top1])>=lev(a[i]))
{
s2[++top2]=s1[top1--];
}
s1[++top1]=a[i];
continue;
}
if(lev(s1[top1])<lev(a[i])&&a[i]!=')')
{
s1[++top1]=a[i];
continue;
}
if(a[i]==')')
{
while(s1[top1]!='(')
{
s2[++top2]=s1[top1--];
}
--top1;
continue;
}
}
}
/*for(int i=top1;i>=1;i--)
{
cout<<s1[i]<<endl;
}*/
while(top1>0)
{
s2[++top2]=s1[top1--];
} //???????????????????,????s2???
for(int i=1;i<=top2;i++)
{
cout<<s2[i]<<" ";
}
cout<<endl;//?????
for(int i=1;i<=top2;i++)
{ p=i;
if(s2[i]>='0'&&s2[i]<='9')
{
js[++topjs]=s2[i]-'0';
}
else
{
if(s2[i]=='+')
{
long long y=js[topjs];
long long x=js[--topjs];
long long ans=x+y;
js[topjs]=ans;
}
if(s2[i]=='-')
{
long long y=js[topjs];
long long x=js[--topjs];
long long ans=x-y;
js[topjs]=ans;
}
if(s2[i]=='*')
{
long long y=js[topjs];
long long x=js[--topjs];
long long ans=x*y;
js[topjs]=ans;
}
if(s2[i]=='/')
{
long long y=js[topjs];
long long x=js[--topjs];
long long ans=x/y;
js[topjs]=ans;
}
if(s2[i]=='^')
{
long long y=js[topjs];
long long x=js[--topjs];
long long ans=pow(x,y);
js[topjs]=ans;
}
print();
}
}
return 0;
}
3、中缀转后缀
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<string>
using namespace std;
char a[100020],s1[10000],s2[100000];
long long n,m,top1,top2;
int lev(char ch)
{
if(ch=='+' || ch=='-')
return 1;
if(ch=='*'||ch=='/')
return 2;
if(ch=='^')
return 3;
return 0;
}
int main()
{
scanf("%s",a);
n=strlen(a);
for(int i=0;i<n;i++)
{
if(a[i]>='0'&&a[i]<='9')
s2[++top2]=a[i];
else
{
if(a[i]=='(')
{
s1[++top1]=a[i];
continue;
}
if(lev(s1[top1])>=lev(a[i])&&a[i]!=')')
{
s2[++top2]=s1[top1--];
while(lev(s1[top1])>=lev(a[i]))
s2[++top2]=s1[top1--];
s1[++top1]=a[i];
continue;
}
if(lev(s1[top1])<lev(a[i])&&a[i]!=')')
{
s1[++top1]=a[i];
continue;
}
if(a[i]==')')
{
while(s1[top1]!='(')
{
s2[++top2]=s1[top1--];
}
top1--;
continue;
}
}
}
while(top1>0)
{
s2[++top2]=s1[top1--];
}
for(int i=1;i<=top2;i++)
cout<<s2[i]<<" ";
return 0;
}