利用栈实现逆波兰计算

利用栈实现逆波兰计算
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
#define MAXBUFFER 10

typedef char ElemType;
typedef struct
{
  ElemType *base;
  ElemType *top;
  int stackSize;
}sqStack;

void InitStack(sqStack *s)
{
  s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof((ElemType ));
  if(!s->base)
      exit(0);
  s->top = s->base; //最开始,栈顶就是栈底
  s->stackSize = STACK_INIT_SIZE; //容量赋值为100

}


void Push(sqStack *s, ElemType e)
{
  if(s->top - s->base >= s->stackSize) //入栈前先进行判断
  {
     s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof((ElemType));
     if(!s->base)
      exit(0);
     s->top = s->base + s->stackSize; //最开始,栈顶就是栈底
     s->stackSize = s->stackSize + STACKINCREMENT) 
  }
  *(s->top) = e;  //栈顶指向入栈的元素,然后栈顶+1,即为入栈程序
  s->top ++;
}

void Pop(sqStack *s, ElemType *e)
{
   if(s->top == s->base)
     return;
  *e = *--(s->top);
}

int StackLen(sqStack s)
{
  return(s.top - s.base);//中间隔了多少元素差
}

int main()//逆波兰表达式计算器
{
	sqStack s;
	char c;
	double d, e;
	char str[MAXBUFFER]; //定义缓冲区

	InitStack(&s);

	printf("请按逆波兰表达式输入待计算数据,数据与运算符之间用空格隔开,以#作为结束标志:")
	scanf("%c", &c);

	while( c != '#')
	{
		while( isdigit(c) || c == '.') //判断字符的ASCII值是否是数字 ,用于过滤数字
		{
			str[i ++] = c;
			str[i] = '\0';
			if (i >= 10)
			{
				printf("出错:输入的单个数据过大!\n");
				return -1;
			}
			scanf("%c",&c);

			if (c == ' ')
			{
				d = atof(str); //字符型到浮点型的转换
				Push(&s, d);
				i = 0;
				break;
			}
		}
		switch( c )
		{
		case '+':
			   Pop(&s,&e);
			   Pop(&s,&d);
			   Push(&s,d +e);
			   break;
		case '-':
			Pop(&s,&e);
			Pop(&s,&d);
			Push(&s,d -e);
			break;
		case '*':
			Pop(&s,&e);
			Pop(&s,&d);
			Push(&s,d -e);
			break;
		case '/':
			Pop(&s,&e);
			Pop(&s,&d);
			if ( e != 0)
			{
				Push(&s,d/e);
			}
			else
			{
				printf("\n出错:除数为零!\n");
				return -1;
			}
			
			break;

		}	
		scanf("%c", &c);

	}
	Pop(&s,&d);
	printf("\n最终的计算结果为:%f\n",d);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值