-------------------------------
#include <bits/stdc++.h>
using namespace std;
char OP[7] = {'+','-','*','/','(',')','#'};
char oppred[7][7] = {
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','X'},
{'>','>','>','>','X','>','>'},
{'<','<','<','<','<','X','='}};
bool isop(char ch)
{
for(int i = 0; i < 7; ++i)
{
if(ch == OP[i]) return true;
}
return false;
}
void changeindex(char ch,int &i)
{
switch(ch)
{
case '+': i = 0; break;
case '-': i = 1; break;
case '*': i = 2; break;
case '/': i = 3; break;
case '(': i = 4; break;
case ')': i = 5; break;
case '#': i = 6; break;
}
}
char Precede(char ch1,char ch2)
{
int i,j;
changeindex(ch1,i);
changeindex(ch2,j);
return oppred[i][j];
}
int Operate(int a,char op,int b)
{
switch(op)
{
case '+': return a + b; break;
case '-': return a - b; break;
case '*': return a * b; break;
case '/': return a / b; break;
default: return 0;
}
}
int main()
{
stack<int> OPEN;
stack<char> OPTR;
char ch = getchar();
OPTR.push('#');
while(ch != '#'|| OPTR.top() != '#')
{
if(!isop(ch))
{
int num = ch - '0'; ch = getchar();
while(not isop(ch))
{
num = num * 10 + ch - '0';
ch = getchar();
}
OPEN.push(num); continue;
}
else
{
switch(Precede(OPTR.top(),ch))
{
case '<':
OPTR.push(ch);
ch = getchar();
break;
case '=':
OPTR.pop();
ch = getchar();
break;
case '>':
char op = OPTR.top();
OPTR.pop();
int b = OPEN.top();
OPEN.pop();
int a = OPEN.top();
OPEN.pop();
OPEN.push(Operate(a,op,b));
}
}
}
cout << OPEN.top() << endl;
return 0;
}
--------------------------------
有没有dalao知道这个代码是做什么的