本程序主要实现了两点:
1.中序转后序。
算法:
对中序进行循环,遇到数字直接输出,遇到运算符则与栈顶的运算符对比,若栈顶的运算符级别大于等于当前运算符的级别则输出栈顶的运算符,此过程循环进行,然后当前运算符进栈。
中序表达式处理完之后将栈中运算符输出。
char *TranInfixToPost(char *infix, char *post)
{
int top = 0;
char *cur;
char stack[MAXLEN];
memset(stack, 0, sizeof(stack));
cur = infix;
while(*cur != '\0')
{
if(isdigit(*cur))
sprintf(post + strlen(post), "%c", *cur);
else
{
while((top > 0) && (GetPriority(*cur) <= GetPriority(stack[top - 1])))
{
sprintf(post + strlen(post), "%c", stack[top - 1]);
top--;
}
stack[top++] = *cur;
}
cur++;
}
while(top > 0)
{
sprintf(post + strlen(post), "%c", stack[top - 1]);
top--;
}
return post;
}
2.计算后序表达式的值。
算法:
1.对后序表达式循环,若当前字符为数字,则入栈,若为操作符,则从栈中取两个操作数进行运算,并将结果入栈。
double CalculatePost(char *post)
{
int top;
int i;
double x, y, z, stack[MAXLEN];;
char ch;
top = 0;
i = 0;
ch = post[0];
while(ch != '\0')
{
if(isdigit(ch))
stack[top++] = ch - '0';
else
{
y = stack[--top];
x = stack[--top];
switch(ch)
{
case '+':
z = x + y;
break;
case '-':
z = x - y;
break;
case '*':
z = x * y;
break;
case '/':
z = x / y;
break;
}
stack[top++] = z;
}
ch = post[++i];
}
return stack[0];
}
makefile文件:
CC = gcc
SRC = $(wildcard *.c)
OBJS = $(patsubst %.c,%.o,$(SRC))
FLAGSO = -Wall -g
FLAGS = -Wall -g -lm --static -std=c99 -DONLINE_JUDGE
TARGET = result
all:$(TARGET)
.PHONY:all
$(TARGET):$(OBJS)
$(CC) $(FLAGS) -o $(TARGET) $(OBJS)
$(OBJS):%.o:%.c
$(CC) -c $(FLAGSO) $^ -o $@
#include ~develop/mkdefine
.PHONY:clean
clean:
-rm $(OBJS) $(TARGET)