只测试有限是数据,测试结果均正确
#include <stdio.h>
#include <ctype.h>
//最大的输入长度
#define MAXSIZE 100
//定义栈
typedef struct stack
{
int stack[MAXSIZE];
int index;
}Stack;
int isNoOp(int ch)
{
if (ch == ')' || ch == '(')
{
return 1;
}
else
{
return 0;
}
}
int isPriority(int ch1, int ch2)
{
if (ch2 == '(') {
return 0;
}
else if (ch2 == ')')
{
return 1;
}
else if (ch2 == '+' || ch2 == '-')
{
if (ch1 == '(') {
return 0;
}
else
{
return 1;
}
}
else
{
if (ch1 == '*' || ch1 == '/' || ch1 == ')') {
return 1;
}
else
{
return 0;
}
}
}
int isEmpty(Stack stack)
{
if (stack.index < 0) {
return 1;
}
else
{
return 0;
}
}
void exchangeStack(Stack *stack)
{
int i;
int temp;
for (i = 0; i <= (stack->index) / 2; i ++) {
temp = stack->stack[i];
stack->stack[i] = stack->stack[stack->index - i];
stack->stack[stack->index - i] = temp;
}
}
void initStack(Stack *stack)
{
int i;
for (i = 0; i < MAXSIZE; i ++) {
stack->stack[i] = 0;
}
stack->index = -1;
}
int push(Stack *stack)
{
return stack->stack[(stack->index) --];
}
void pull(Stack *stack, int x)
{
stack->stack[++ (stack->index)] = x;
}
Stack num,operate,num2,operate2;
int op1,op2,op3,first = 0,opx,opy,sum = 0,flag = 0;
int Calculate(char ch, int x, int y)
{
switch (ch) {
case '+':
return x + y;
break;
case '-':
return x - y;
break;
case '*':
return x * y;
break;
case '/':
return x / y;
break;
}
return -1;
}
void handle(char ch)
{
if (isEmpty(operate2) && flag == 1)
{
if (isEmpty(operate))
{
if (isEmpty(num2))
{
opx = push(&num);
opy = push(&num);
sum = Calculate(op1, opx, opy);
pull(&num, sum);
}
else
{
opx = push(&num2);
opy = push(&num);
sum = Calculate(op1, opx, opy);
pull(&num, sum);
}
}
else
{
op2 = push(&operate);
if (isPriority(op1, op2))
{
pull(&operate, op2);
if (isEmpty(num2))
{
opx = push(&num);
opy = push(&num);
sum = Calculate(op1, opx, opy);
pull(&num2, sum);
}
else
{
opx = push(&num2);
opy = push(&num);
sum = Calculate(op1, opx, opy);
pull(&num2, sum);
}
}
else
{
pull(&operate2, op1);
pull(&operate2, op2);
if (op2 != '(')
{
sum = push(&num);
pull(&num2, sum);
}
}
}
}
else
{
if (isEmpty(operate))
{
if (isEmpty(num2))
{
opx = push(&num);
opy = push(&num);
sum = Calculate(op1, opx, opy);
pull(&num, sum);
}
else
{
opx = push(&num2);
opy = push(&num);
sum = Calculate(op1, opx, opy);
pull(&num, sum);
}
}
else
{
op2 = push(&operate);
if (isPriority(op1, op2))
{
pull(&operate, op2);
if (isEmpty(num2))
{
opx = push(&num);
opy = push(&num);
sum = Calculate(op1, opx, opy);
pull(&num, sum);
}
else
{
opx = push(&num2);
opy = push(&num);
sum = Calculate(op1, opx, opy);
pull(&num, sum);
}
}
else
{
pull(&operate2, op1);
pull(&operate2, op2);
if (op2 != '(')
{
sum = push(&num);
pull(&num2, sum);
}
}
}
}
}
int main(int argc, const char * argv[])
{
initStack(&num);
initStack(&operate);
initStack(&num2);
initStack(&operate2);
char ch[100] = {},ch1;
int i = -1;
int size = 1;
int temp;
scanf("%s",ch);
while ((ch1 = ch[++ i]) != '\0')
{
if ((ch1 == '(' || ch1 == ')' || ch1 == '+' || ch1 =='*' || ch1 == '/')
|| (ch1 == '-' && i > 0 && isdigit(ch[i - 1]))) {
flag = 0;
size = 1;
pull(&operate, ch1);
}
else if (ch1 == '-')
{
size = -1;
}
else
{
if (flag == 0) {
pull(&num, size * (ch1 - 48));
flag = 1;
}
else
{
temp = push(&num) * 10 + size * (ch1 - 48);
pull(&num, temp);
}
}
}
exchangeStack(&num);
exchangeStack(&operate);
flag = -1;
while (1) {
if (isEmpty(operate2) && isEmpty(num2)) {
pull(&num2, push(&num));
}
if (!isEmpty(operate2))
{
flag = 1;
op1 = push(&operate2);
}
else if (!isEmpty(operate))
{
flag = 0;
op1 = push(&operate);
}
else
{
flag = -1;
break;
}
switch (op1)
{
case '(':
pull(&operate2,op1);
op2 = push(&operate);
pull(&operate2,op2);
if (!isNoOp(op2))
{
pull(&num2,push(&num));
}
break;
case ')':
push(&operate2);
break;
case '+':
handle('+');
break;
case '-':
handle('-');
break;
case '*':
handle('*');
break;
case '/':
handle('/');
break;
}
}
if (!isEmpty(num2)) {
printf("%d\n",push(&num2));
}
else if (!isEmpty(num))
{
printf("%d\n",push(&num));
}
return 0;
}