通过后缀表达式模拟计算器

模拟栈 stack.h

#inndef _STACK_H
#define _STACK_H


typedef char Bool;
typedef int StackType;
typedef struct stack stack;

#define false 0
#define true  1
#define MAXSIZE 100

struct stack
{
	StackType buf[MAXSIZE];
	int top;
};

extern Bool isEmpty(stack *ps);
extern Bool isFull(stack *ps);
extern void initStack(stack *ps);
extern Bool push(stack *ps,StackType data);
extern Bool pop(stack *ps,StackType *pdata);


#endif
stack.c

#include <stdio.h>
#include "stack.h"


Bool isEmpty(stack *ps)
{
	if(-1 == ps->top)
		return true;
	else
		return false;
}

Bool isFull(stack *ps)
{
	if(MAXSIZE-1 == ps->top)
		return true;
	else
		return false;
}

void initStack(stack *ps)
{
	ps->top = -1;
}

Bool push(stack *ps,StackType data)
{
	if(isFull(ps))
		return false;
	ps->buf[++(ps->top)] = data;
	return true;
}

Bool pop(stack *ps,StackType *pdata)
{
	if(isEmpty(ps))
		return false;
	*pdata = ps->buf[(ps->top)--];
		return true;
}

calc.c

#include <stdio.h>
#include "stack.h"


void main()
{
	struct stack s;

	initStack(&s);

	char opr[] = "32546*+*+41*+";

	int i=0;

	while('\0' != opr[i++])
	{
		//num push
		if(opr[i]>='0' && opr[i]<='9')
		{
			if(!push(&s,(opr[i]-'0')))
			{
				printf("length not enough\n");
				return;
			}
		}
		//ch  pop two calc push
		else if('+'==opr[i] || '-' == opr[i] || '*' == opr[i] || '/' == opr[i])
		{
			int num1,num2;
			if(!pop(&s,&num1) || !pop(&s,&num2))
			{
				return;
			}
			int value;
			switch(opr[i])
			{
				case '+':
					value = num2+num1;
					break;
				case '-':
					value = num2-num1;
					break;
				case '*':
					value = num2*num1;
					break;
				case '/':
					value = num2/num1;
					break;
			}
			if(!push(&s,value))
			{
				printf("length not enough\n");
				return;
			}	
		}
		else
		{
			printf(" input error\n");
			return;
		}
	}
		
	int ret;
	pop(&s,&ret);
	
	printf("%s = %d\n",opr,ret);
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值