📄 expressex.cpp
字号:
// ExpressEx.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream.h"
#include "Stack.h"
#include "String.h"
#include "OPObject.h"
#include "IntObject.h"
//return 0: >
//return 1: <
//return 2: =
//return 3: no relation
int F(char op1, char op2)
{
switch(op1)
{
case '+':
switch(op2)
{
case '+':
return 0;
case '-':
return 0;
case '*':
return 1;
case '/':
return 1;
case '(':
return 1;
case ')':
return 0;
case '#':
return 0;
};
case '-':
switch(op2)
{
case '+':
return 0;
case '-':
return 0;
case '*':
return 1;
case '/':
return 1;
case '(':
return 1;
case ')':
return 0;
case '#':
return 0;
};
case '*':
switch(op2)
{
case '+':
return 0;
case '-':
return 0;
case '*':
return 0;
case '/':
return 0;
case '(':
return 1;
case ')':
return 0;
case '#':
return 0;
};
case '/':
switch(op2)
{
case '+':
return 0;
case '-':
return 0;
case '*':
return 0;
case '/':
return 0;
case '(':
return 1;
case ')':
return 0;
case '#':
return 0;
};
case '(':
switch(op2)
{
case '+':
return 1;
case '-':
return 1;
case '*':
return 1;
case '/':
return 1;
case '(':
return 1;
case ')':
return 2;
case '#':
return 3;
};
case ')':
switch(op2)
{
case '+':
return 0;
case '-':
return 0;
case '*':
return 0;
case '/':
return 0;
case '(':
return 3;
case ')':
return 0;
case '#':
return 0;
};
case '#':
switch(op2)
{
case '+':
return 1;
case '-':
return 1;
case '*':
return 1;
case '/':
return 1;
case '(':
return 1;
case ')':
return 3;
case '#':
return 2;
};
};
return 3;
}
int main(int argc, char* argv[])
{
//save expression inputed
char express[1000];
CStack numStack;
CStack opStack;
int idx = 0;
/******************************************************************************************/
//输入一个表达式
cin>>express;
//use two '#' enclose expression
strcat(express,"#");
//initialize op stack
/*****************************************************************************************/
opStack.push(new COPObject('#'));
while(opStack.getLength() > 0)
{
if(idx >= (signed)strlen(express))
{
cout<<"ERROR: outof the scape of expression.\n";
return 0;
}
if(express[idx] >= '0' && express[idx] <= '9')//means it's a number
{
numStack.push(new CIntObject(express[idx] - '0'));
idx++;
continue;
}
else
{
while(F(((COPObject *)opStack.getTop())->data , express[idx]) == 0)
{
char op = ((COPObject *)opStack.pop())->data;
if(numStack.getLength() < 2)
{
cout<<"ERROR: number is less than needs in numStack.\n";
return 0;
}
int n2 = ((CIntObject *)numStack.pop())->data;
int n1 = ((CIntObject *)numStack.pop())->data;
int res = 0;
switch(op)
{
case '+':
res = n1 + n2;
break;
case '-':
res = n1 - n2;
break;
case '*':
res = n1 * n2;
break;
case '/':
res = n1 / n2;
break;
default:
cout<<"ERROR:......\n";
return 0;
};
numStack.push(new CIntObject(res));
};
if(F(((COPObject *)opStack.getTop())->data,express[idx]) == 2)
{
opStack.pop();
idx++;
continue;
}
opStack.push(new COPObject(express[idx]));
idx++;
}
}
if(numStack.getLength() != 1)
{
cout<<"ERROR: no result calculated.\n";
return 0;
}
cout<<((CIntObject *)numStack.pop())->data;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -