后缀表达式计算器

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<malloc.h>
using namespace std;
typedef struct StackNode
{
	int  data;
	struct StackNode *next; 
} StackNode,*LinkStack;

void InitStack(LinkStack &S)  //构造一个空栈 
{
	S=NULL;
	printf("\t\t\t空栈创建成功\n"); 
}
void Push(LinkStack &S,int e)      //入栈 
{
	 StackNode *p;
     p= new StackNode;	
	 //p=(StackNode *)malloc(sizeof(StackNode));  //生成新节点 
     p->data=e;
	 p->next=S;
	 S=p; 
}
 
 int  GetTop(LinkStack S)    //返回栈顶元素 
{
	if(S!=NULL)     //栈非空 
	 return S->data; 
}
int In(char i)
{
	//int a;
	switch(i)
	{
		case '+' :  return 1;
		case '-' :  return 1;
		case '*' :  return 1;
		case '/' :  return 1;
		case '(' :  return 1;
		case ')' :  return 1;
		case ' ' :  return 1;
		case  '$':  return 1;
 	    default	 :  return 0;
	}

}
int  Operate(int a,char theta,int b)
{
	switch(theta)
	{
		case '+': return a+b;
		case '-': return a-b;
		case '*': return a*b;
		case '/': return a/b;
		
	}
}
void Pop(LinkStack &S,int &e)  //出栈 
{
	StackNode *p;
	if(S==NULL) 
	{
		printf("栈为空"); 
	}
	e=S->data;
	p=S;
	S=S->next;
	delete p;
}
int  EvaluateExpression()
{
	char theta,ch;
	int a,b;
	int m=0;
//	LinkStack OPTR;  //运算符栈 
	LinkStack OPND;  //运算数栈 
	InitStack(OPND);
//	InitStack(OPTR);
	Push(OPND,'#');
    printf("请输入后缀表达式(并以$结尾):\n"); 
	ch=getchar();
	while(ch!='$')
	{
		if(!In(ch))   //判断读取到的字符是不是数字 
		{ //字符是数字 
			while(!In(ch))
		   {
		 	ch=ch-'0';
			m=m*10+ch;
			ch=getchar();
		   }
		   if(m!=0)
		   {
		   	Push(OPND,m);
		   	m=0; 
		   }
		} 
		else   //读取到的字符是空格或者四则运算符 
		{
			if(ch==' ')   //判断是不是空格 
			{
				ch=getchar();
			}else   //读取到的字符是四则运算符号 
		  {	
			Pop(OPND,b);
			Pop(OPND,a);
			Push(OPND,Operate(a,ch,b));
			ch=getchar();
		  }
		}

	} 
    return GetTop(OPND);   //返回最终计算值 
}
int main()
{
	int num;
	num=EvaluateExpression();
	cout<<num;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值