利用栈实现逆波兰计算

利用栈实现逆波兰计算
#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
逆波兰表示法是一种将数学表达式中运算符放在操作数之后的表示方式。而YACC是一种语法分析工具,用于构建编译器和解释器。 为了实现逆波兰符号计算器,我们可以利用YACC来解析输入的逆波兰表达式,并进行相应的计算。以下是可能的实现步骤: 1. 首先,定义逆波兰表达式的语法规则,并按照YACC的规则书写语法规约文件。 2. 在YACC文件中,定义逆波兰表达式中的运算符和操作数的规则。例如,可以定义 +、-、* 和 / 等算术运算符,以及数字。 3. 在YACC文件中,编写规约部分,指定逆波兰表达式中的运算符和操作数的计算顺序。可以使用来保存操作数,并将运算符应用顶的两个操作数。最终,将计算结果推回中。 4. 编写逆波兰表达式计算器的驱动程序。该程序将循环读取用户输入的逆波兰表达式,并使用YACC进行语法分析和计算。 5. 在计算器驱动程序中,使用lex工具来生成词法分析器。词法分析器将读取用户输入的表达式,并将其转化为逆波兰表达式的符号流。 6. 编译并运行逆波兰计算器的驱动程序。用户输入逆波兰表达式后,程序将使用YACC进行语法分析和计算,并输出结果。 通过以上步骤的实现,我们可以成功构建一个逆波兰符号计算器。用户只需输入逆波兰表达式,程序将进行语法分析和计算,并输出计算结果。这种实现方法具有简便、高效的特点,并且逆波兰表达式也相对容易理解和计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值