📄 3.cpp
字号:
#include <iostream>
#include <string>
#include "stack.h"
#define ISOP(a) ( (a)=='+'||(a)=='-'||(a)=='*'||(a)=='/'||(a)=='('||(a)==')' )
using namespace std;
double inputNumber(char** ppstr)
{
double dResult =0;
char* pstr = *ppstr;
while ('0'<=*pstr && *pstr<='9')
{
dResult*=10;
dResult+=*pstr-'0';
pstr++;
}
double dT = 0.1;
if (*pstr=='.')
{
pstr++;
while ('0'<=*pstr && *pstr<='9')
{
dResult+=(*pstr-'0')*dT;
dT/=10;
pstr++;
}
}
*ppstr = pstr;
return dResult;
}
int isp(char x){ //栈内优先级判断
// assert(x == '#' || x == '+' || x == '-' || x == '*' || x == '/'||x=='('||x==')');
switch(x){
case'#':return 0;
case'+':return 3;
case'-':return 3;
case'*':return 5;
case'/':return 5;
case'(':return 1;
case')':return 8;
}
return -1;
}
int icp(char x){ //栈外优先级判断
// assert( x == '+' || x == '-' || x == '*' || x == '/'||x=='('||x==')');
switch(x){
case'+':return 2;
case'-':return 2;
case'*':return 4;
case'/':return 4;
case'(':return 8;
case')':return 1;
}
return -1;
}
void infix2postfix(char* pstr)
{
Stack<double> dStack;//for operands
Stack<char> cStack;//for operator
cStack.Push('#');
double dT;
char cT;
// if ('0'<=*pstr && *pstr<='9')
// {
// dT=inputNumber(&pstr);
// dStack.Push(dT);
// }
// if (ISOP(*pstr))
// {
// cT =*pstr++;
// cStack.Push(cT);
// }
double op1,op2;
char op;
while (*pstr != '=')
{
if ('0'<=*pstr && *pstr<='9')
{
dT = inputNumber(&pstr);
dStack.Push(dT);
}
else if (ISOP(*pstr))
{
cT = *pstr++;
if (icp(cT)>isp(cStack.Top()))
{
cStack.Push(cT);
}
else if (cT==')')
{
op = cStack.Pop();
while (op!='(')
{
if (!dStack.IsEmpty())
{
op2 = dStack.Pop();
}
else
{
cout<<"操作数错误!"<<endl;return;
}
if (!dStack.IsEmpty())
{
op1 = dStack.Pop();
}
else
{
cout<<"操作数错误!"<<endl;return;
}
if (op=='/' && op2 == 0.0)
{
cout<<"除数不能为零!"<<endl;return;
}
switch(op)
{
case '+':
dStack.Push(op1+op2);break;
case '-':
dStack.Push(op1-op2);break;
case '*':
dStack.Push(op1*op2);break;
case '/':
dStack.Push(op1/op2);break;
default:
break;
}
if (!cStack.IsEmpty())
{
op = cStack.Pop();
}
else
{
cout<<"操作符错误"<<endl;return;
}
}
}
else
{
do
{
if (!cStack.IsEmpty())
{
op = cStack.Pop();
}
else
{
cout<<"操作符错误"<<endl;return;
}
if (!dStack.IsEmpty())
{
op2 = dStack.Pop();
}
else
{
cout<<"操作数错误!"<<endl;return;
}
if (!dStack.IsEmpty())
{
op1 = dStack.Pop();
}
else
{
cout<<"操作数错误!"<<endl;return;
}
if (op=='/' && op2 == 0.0)
{
cout<<"除数不能为零!"<<endl;return;
}
switch(op)
{
case '+':
dStack.Push(op1+op2);break;
case '-':
dStack.Push(op1-op2);break;
case '*':
dStack.Push(op1*op2);break;
case '/':
dStack.Push(op1/op2);break;
default:
break;
}
} while(icp(cT)<=isp(cStack.Top()));
cStack.Push(cT);
}
}
else
{
cout<<"Illegal Ops!"<<endl;
return;
}
}
while (cStack.Top()!='#')
{
if (!dStack.IsEmpty())
{
op2 = dStack.Pop();
}
else
{
cout<<"操作数错误!"<<endl;return;
}
if (!dStack.IsEmpty())
{
op1 = dStack.Pop();
}
else
{
cout<<"操作数错误!"<<endl;return;
}
if (!cStack.IsEmpty())
{
op = cStack.Pop();
}
else
{
cout<<"操作符错误"<<endl;return;
}
if (op=='/' && op2 == 0.0)
{
cout<<"除数不能为零!"<<endl;return;
}
switch(op)
{
case '+':
dStack.Push(op1+op2);break;
case '-':
dStack.Push(op1-op2);break;
case '*':
dStack.Push(op1*op2);break;
case '/':
dStack.Push(op1/op2);break;
default:
break;
}
}
cout<<dStack.Top()<<endl;
}
int main(int argc, char* argv[])
{
char szInput[512];
if (argc>1)
{
strcpy(szInput,argv[1]);
}
else
{
cin>>szInput;
}
//cout<<szInput<<endl;
infix2postfix(szInput);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -