简单的计算器小程序(不带括号)

本程序主要实现了两点:

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值