下载地址
http://note.youdao.com/yws/public/resource/0e69c6de95b576ea2a028b5fd970c2ce/E123404216F4435FAD4B3A8D76D508DD
#include <stdio.h>
#include "LinkStack.h"
int isNumber(char c)
{
return ('0' <= c) && (c <= '9');
}
int isOperator(char c)
{
return (c == '+') || (c == '-') || (c == '*') || (c == '/');
}
int isLeft(char c)
{
return (c == '(');
}
int isRight(char c)
{
return (c == ')');
}
int priority(char c)
{
int ret = 0;
if( (c == '+') || (c == '-') )
{
ret = 1;
}
if( (c == '*') || (c == '/') )
{
ret = 2;
}
return ret;
}
char* transform(const char* exp)
{
printf("输入%s\n" , exp);
int i = 0;
int j = 0;
char * result = (char*)malloc(sizeof(char) * 100 );
LinkStack* stack = LinkStack_Create();
while( exp[i] != '\0' )
{
if( isNumber(exp[i]) )
{
//output(exp[i]);
result[j] = exp[i];
j++;
}
else if( isOperator(exp[i]) )
{
if(LinkStack_Size(stack) > 0){
while( priority(exp[i]) <= priority((char)(int)LinkStack_Top(stack)) )
{
//output((char)(int)LinkStack_Pop(stack));
result[j] = (char)(int)LinkStack_Pop(stack);
j++;
}
}
LinkStack_Push(stack, (void*)(int)exp[i]);
}
else if( isLeft(exp[i]) )
{
LinkStack_Push(stack, (void*)(int)exp[i]);
}
else if( isRight(exp[i]) )
{
//char c = '\0';
while( !isLeft((char)(int)LinkStack_Top(stack)) )
{
//output((char)(int)LinkStack_Pop(stack));
result[j] = (char)LinkStack_Pop(stack);
j++;
}
LinkStack_Pop(stack);
}
else
{
printf("Invalid expression!");
break;
}
i++;
}
while( (LinkStack_Size(stack) > 0) && (exp[i] == '\0') )
{
//output((char)(int)LinkStack_Pop(stack));
result[j] = (char)LinkStack_Pop(stack);
j++;
}
printf("转后缀%s\n" , result);
LinkStack_Destroy(stack);
return result;
}
int value(char c)
{
return (c - '0');
}
int express(int left, int right, char op)
{
int ret = 0;
switch(op)
{
case '+':
ret = left + right;
break;
case '-':
ret = left - right;
break;
case '*':
ret = left * right;
break;
case '/':
ret = left / right;
break;
default:
break;
}
return ret;
}
int compute(const char* exp)
{
LinkStack* stack = LinkStack_Create();
int ret = 0;
int i = 0;
while( exp[i] != '\0' )
{
if( isNumber(exp[i]) )
{
LinkStack_Push(stack, (void*)value(exp[i]));
}
else if( isOperator(exp[i]) )
{
int right = (int)LinkStack_Pop(stack);
int left = (int)LinkStack_Pop(stack);
int result = express(left, right, exp[i]);
LinkStack_Push(stack, (void*)result);
}
else
{
printf("Invalid expression!");
break;
}
i++;
}
if( (LinkStack_Size(stack) == 1) && (exp[i] == '\0') )
{
ret = (int)LinkStack_Pop(stack);
}
else
{
printf("Invalid expression!");
}
LinkStack_Destroy(stack);
return ret;
}
int main()
{
printf("结果%d\n" , compute(transform("8+(3-1)*5")));
system("pause");
return 0;
}
http://note.youdao.com/share/?id=0e69c6de95b576ea2a028b5fd970c2ce&type=note#/