#include <iostream>
using namespace std;
typedef struct MNode
{
int data;
struct MNode *next;
} MNode, *MathStack;
typedef struct CNode
{
char data;
struct CNode *next;
} CNode, *CharStack;
int Switch(char e)
{
if ((e - 48) >= 0 && (57 - e) <= 9)
return e - 48;
else
return -1;
}
void PushMath(MathStack &S, int e)
{
MathStack p;
p = new MNode;
p->data = e;
p->next = S;
S = p;
}
void PushChar(CharStack &S, char e)
{
CharStack p;
p = new CNode;
p->data = e;
p->next = S;
S = p;
}
char GetTop(CharStack S)
{
return S->data;
}
char Precede(char a, char b)
{
int i, j;
char pre[][7] = {
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '<', '<', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'>', '>', '>', '>', '<', '>', '>'},
{'<', '<', '<', '<', '<', '=', '0'},
{'>', '>', '>', '>', '0', '>', '>'},
{'<', '<', '<', '<', '<', '0', '='}};
switch (a)
{
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;
}
switch (b)
{
case '+':
j = 0;
break;
case '-':
j = 1;
break;
case '*':
j = 2;
break;
case '/':
j = 3;
break;
case '(':
j = 4;
break;
case ')':
j = 5;
break;
case '#':
j = 6;
break;
}
return pre[i][j];
}
int PopMath(MathStack &MS)
{
MathStack p;
int e;
p = MS;
e = MS->data;
MS = MS->next;
delete p;
return e;
}
char PopChar(CharStack &CS)
{
CharStack p;
char e;
p = CS;
e = CS->data;
CS = CS->next;
delete p;
return e;
}
int Operate(int a, char c, int b)
{
switch (c)
{
case '+':
a = a + b;
break;
case '-':
a = b - a;
break;
case '*':
a = a * b;
break;
case '/':
a = b / a;
break;
}
return a;
}
int main()
{
cout << endl;
cout << endl;
cout << "\t\t输入前请确保输入法切换到英文" << endl;
cout << "————————————————————————————" << endl;
cout << "********************************************************" << endl;
cout << "————————————————————————————" << endl;
Loop:
cout << "\t\t本次输入以#为结束标志" << endl;
MathStack MS;
MS = new MNode;
MS->next = NULL;
CharStack CS;
CS = new CNode;
CS->next = NULL;
PushChar(CS, '#');
int a, b, F;
char ch, theta;
cin >> ch;
while (ch != '#' || GetTop(CS) != '#')
{
if (Switch(ch) >= 0)
{
PushMath(MS, Switch(ch));
cin >> ch;
}
else
switch (Precede(GetTop(CS), ch))
{
case '<':
PushChar(CS, ch);
cin >> ch;
break;
case '=':
PopChar(CS);
cin >> ch;
break;
case '>':
a = PopMath(MS);
b = PopMath(MS);
theta = PopChar(CS);
PushMath(MS, Operate(a, theta, b));
break;
}
}
cout << "=" << PopMath(MS) << "" << endl;
cout << "\t\t本次计算完成,退出请按0,继续请按1" << endl;
cin >> F;
if (F)
{
cout << "————————————————————————————" << endl;
cout << "********************************************************" << endl;
cout << "————————————————————————————" << endl;
goto Loop;
}
return 0;
}