📄 postfix.h
字号:
#include"Stack.h" //链式栈类,模板
#include"string.h"
#include"math.h"
typedef long double type;
char* toPostfix(char *expstr) //将中缀表达式转换成后缀表达式
{
Stack<char> s1; //创建空栈,数据元素类型为char
char *poststr=new char[strlen(expstr)+1];
char out;
int i=0,j=0;
while(expstr[i]!='\0')
{
// cout<<"expstr["<<i<<"]="<<expstr[i];
switch(expstr[i])
{
case '+':
case '-': //遇见+、-运算符时,与栈顶元素比较
while(!s1.isEmpty() && s1.get()!='(')
{
poststr[j]=s1.pop();
j++;
}
s1.push(expstr[i]); //当前运算符入栈
i++;
break;
case 't':
case 's':
case 'C':
case 'c':
case 'l':
case 'L':
while(!s1.isEmpty() && (s1.get()=='t' || s1.get()=='s' || s1.get()=='C' || s1.get()=='c' || s1.get()=='l' || s1.get()=='L'))
{
poststr[j]=s1.pop();
j++;
}
s1.push(expstr[i]);
i++;
break;
case '*':
case '/': //遇见*、/运算符时,与栈顶元素比较
while(!s1.isEmpty() && (s1.get()=='*' || s1.get()=='/'))
{
poststr[j]=s1.pop();
j++;
}
s1.push(expstr[i]); //当前运算符入栈
i++;
break;
case '(': //遇见左括号时,入栈
s1.push(expstr[i]);
i++;
break;
case ')': //遇见右括号时,出栈
out=s1.pop();
while(!s1.isEmpty() && out!='(') //判断出栈的是否为左括号
{
poststr[j]=out;
j++;
out=s1.pop();
}
i++;
break;
case 'P':
while(expstr[i]=='P')
{
poststr[j]=expstr[i];
i++;
j++;
}
poststr[j]=' ';
j++;
break;
case '0': case '1': case '2': case '3':case '4': case '5': case '6': case '7': case '8': case '9':
while(expstr[i]>='0' && expstr[i]<'9' && expstr[i]!='\0')
{ //遇见数字时,加入到后缀表达式
poststr[j]=expstr[i];
i++;
j++;
}
poststr[j]=' '; //数字之间以空格分离
j++;
break;
default:
while(expstr[i]!='\0')
{
cout<<" 对不起,您的输入有误,请重新输入!\n";
i++;
}
}
poststr[j]='\0';
// cout<<" poststr="<<poststr<<"\t";
// cout<<s1;
}
while(!s1.isEmpty())
{
poststr[j]=s1.pop();
j++;
}
poststr[j]='\0'; //后缀表达式字符串加结束符
return poststr;
}
type value(char *poststr) //计算后缀表达式的值
{
Stack<type> s2; //创建空栈,数据元素类型为type
char *p=poststr;
type x,y,z,h;
while(*p!='\0') //逐个检查后缀表达式中的字符
{
// cout<<"*p="<<*p<<" ";
if(*p>='0' && *p<='9') //遇到数字字符
{
z=0;
while(*p!=' ') //字符串转化为数值
{
z=z*10+*p-'0';
p++;
}
s2.push(z); //z值入栈
p++;
}
else if(*p=='P')
{
while(*p=='P')
{
z=3.141592654;
p++;
}
s2.push(z);
p++;
}
else
{
if(*p!=' ' && (*p=='t' || *p=='C' || *p=='s' || *p=='c' || *p=='l' || *p=='L'))
{
h=s2.pop();
switch(*p)
{
case 't': z=tan(h); break;
case 's': z=sin(h); break;
case 'C': z=1/tan(h); break;
case 'c': z=cos(h); break;
case 'l': z=log10(h);break;
case 'L': z=log(h); break;
}
s2.push(z);
p++;
}
else if(*p!=' ')
{
y=s2.pop(); //出栈两个值
x=s2.pop();
switch(*p) //根据运算符,计算结果
{
case '+':z=x+y; break;
case '-':z=x-y; break;
case '*':z=x*y; break;
case '/':z=x/y; break;
}
s2.push(z); //计算结果再次入栈
p++;
}
}
// cout<<s2;
}
return s2.pop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -