四则运算实现

原创 2003年07月03日 13:57:00
#include"conio.h"
#include "stdio.h"
#include "stdlib.h"
#define STACK_INIT_SIZE 100
#define STACKINCREMENT  10
typedef char  SElemType;
typedef int    Status;
#define  OK        1 
#define  OVERFLOW  0
#define  ERROR     0
typedef struct{
	SElemType *base;
	SElemType *top;
	int stacksize;
}SqStack;

Status InitStack(SqStack &s){//构造一个空栈
        s.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
		if(!s.base)exit(OVERFLOW);
		s.top=s.base;
		s.stacksize=STACK_INIT_SIZE;
		return OK;
}//InitStack
SElemType Getop(SqStack s){//若栈不空,则返回用e返回s栈元素
	    SElemType e;
		if(s.top==s.base)return ERROR;
		e=*(s.top-1);
		return e;
}//Getop
Status Push(SqStack &s,SElemType e){//插入元素e为新的栈顶元素
	   if(s.top-s.base>=s.stacksize){//栈满,追加存储空间
		   s.base=(SElemType *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SEle
mType));
		   if(!s.base)exit(OVERFLOW);//存储分配失败
		   s.top=s.base+s.stacksize;
		   s.stacksize+=STACKINCREMENT;
	   }
	   *s.top++=e;
	   return OK;
}//Push
Status Pop(SqStack &s,SElemType &e){//若栈不空,则删除s的栈顶元素,用e 返回其值,并
返回OK,否则返回ERROR
	   if(s.top==s.base)return ERROR;
	   e=*--s.top;
	   return OK;
}//Pop


char Precede(char e,char c){//比较运算任符的优先权
	if(e=='+')
	{	if(c=='+'||c=='-'||c==')'||c=='#')
			return '>';
	      return '<';
	}
	else if(e=='-')
	{ 
		if(c=='+'||c=='-'||c==')'||c=='#')
			return '>';
		   return '<';
	}
	else if(e=='*')
	{
		if(c=='(')
			return '<';
         return '>';
	}
	else if(e=='/')
	{
		if(c=='(')
			return '<';
      return '>';
	}
	else if(e=='(')
	{
		if(c==')')
			return '=';
		else if(c=='+'||c=='-'||c=='*'||c=='/'||c=='(')
			return '<';
	}
	else if(e==')')
	{
		if(c=='+'||c=='-'||c=='*'||c=='/'||c==')'||c=='#')
    return '>';
	}
	else if(e=='#')
	{	if(c=='#')
			return '=';
		     else if(c=='+'||c=='-'||c=='*'||c=='/'||c=='(')
			return '<';
	}
return 0;
}

int  Operate(char b,char theta,char a) {//运算
    int  temp;
//	b-=48;a-=48;
	 if(theta=='+')
	 temp =b+a;
	else if(theta=='*')
		temp=b * a;
	else if(theta=='-')
		temp=b-a;
	else if(theta=='/')
		temp=b/a;

	return temp;
}

char OP[]={'+','-','*','/','(',')','#'};
int In(char c,char OP[])//比较是否为运算符
{   int i;
     for(i=0;i<=6;i++)
	 if(c==OP[i])
		return 1;
	return 0;
}	
char EvluateExpression(){
	//算术表达式求值的算符优先算法.设OPTR和OPND分别为运算栈和运算数栈,
	//OP为运算任集合
	SqStack OPTR,OPND;char a,b,c,x,theta;
	InitStack(OPTR); Push(OPTR,'#');
	InitStack(OPND);c=getchar();
	 while(c!='#'||Getop(OPTR)!='#'){
		if(!In(c,OP)){Push(OPND,c-48);c=getchar();}//不是运算符则进栈
		else
			switch(Precede(Getop(OPTR),c)){
			case '<'://栈顶元素优先权低
				  Push(OPTR,c);c=getchar();break;
			case  '='://脱括号并接收下一字符
				  Pop(OPTR,x);c=getchar();break;
			case  '>'://退栈并将运算结果入栈
				  Pop(OPTR,theta);
				  Pop(OPND,b);Pop(OPND,a);
				  Push(OPND,Operate(a,theta,b));
				  break;
		}//switch
	}//while
	return Getop(OPND);
}//EvluateExpression
void main()
{  char temp;
   temp=EvluateExpression();
   printf("%d/n",temp);
   return;
}
/*本例子能实现如:9+6-5*2/1#
结果为5
实现四则运算.供大家学习作参考.

很简单的C++实现四则运算

网上看了些C++实现四则运算的文章,代码都很乱,在此给出自己实现的很简单的可运行代码。 /* * TestRPN.h * * C++实现整数四则运算 * * 有两个步骤, 一是convert...
  • liangtb
  • liangtb
  • 2015年03月18日 17:12
  • 4593

用java实现简单四则运算的算法

实现的功能例如:(12*3/-2)*(3+5)/2 = -72 应用场景:在计算器中输入一大串四则运算表达式,如何按下‘=’号,得出对应的正确结果,今天就来完成该功能的实现。思路分析首先拿到一个表...
  • HeadingAlong
  • HeadingAlong
  • 2017年01月29日 13:56
  • 2906

栈的应用--简单四则运算

思想:我们平时输入的四则运算表达式,例如:9*(3-1)+2,属于中缀表达式。我们需要将它转换成后缀表达式: 9 3 1 - * 2 +的形式求值。其中需要两个栈:数字栈和运算符栈。 过程...
  • you_shou
  • you_shou
  • 2016年05月11日 13:29
  • 2262

四则运算在计算机中的实现原理

一、中缀表达式需要转换成后缀表达式,转换算法: 1、遇到操作数:直接输出(添加到后缀表达式中) 2、栈为空时,遇到运算符:直接入栈 3、遇到左括号:将其入栈 4、遇到右括号:执行出栈操作,并将出栈的元...
  • yangxu4536
  • yangxu4536
  • 2016年07月04日 18:16
  • 1136

C#四则运算的实现

看大话数据结构 利用栈实现四则运算这一块儿正好是只有讲解没有代码实现的 于是照着书上的原理自己写了个四则运算的C#代码 以后可以考虑到作为自己的类库中的组件 主要涉及的是逆波兰式 程序主要部分为逆波...
  • xboxeer
  • xboxeer
  • 2011年08月27日 21:07
  • 4150

C语言实现表达式求值,支持+、-、*、/四则运算,并且支持多级括号,自定义了栈的操作。

#include #include #define N 50        //定义接收字符串大小 typedef struct _node_ {     int num_ch;     //...
  • niha1993825jian
  • niha1993825jian
  • 2014年10月30日 12:59
  • 2491

用栈实现四则运算表达式(c++)

水平有限,花了两个小时实现了用栈进行基本的四则运算,只针对整数的运算。(即使两个整数相除也将得到整数)思路:将输入的中缀表达式用栈转化为后缀表达式,再根据后缀表达式用栈实现运算。中缀表达式:运算符位于...
  • scuisdccch
  • scuisdccch
  • 2015年09月29日 09:55
  • 2471

Java实现简单四则运算

工作之余,突然想用java实现一下四则运算,经过简单的构思,很快就有了思路,就完成了一个简单版本。 经过慎重考虑,觉得使用栈还是要比数组或者List容易对符号和数字进行控制。 我使用两个栈...
  • u013276512
  • u013276512
  • 2017年10月30日 14:36
  • 405

栈实现四则运算

四则运算表达式的求值分为三步:1、解析:将字符串表达式解析为计算机能够理解的形式,这儿的字符串表达式也叫中缀表达式,比如说9+(3-1)*3+10/2就是一个中缀表达式。这一步需要做的事情就是解析这个...
  • css1991cm
  • css1991cm
  • 2016年03月26日 16:14
  • 561

四则运算计算器(面向对象编程思维)

写计算器感知  1,定义接口   public interface ICalculate     {         double Operation(double operatorX...
  • stupid_Qiu
  • stupid_Qiu
  • 2017年04月13日 23:18
  • 253
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:四则运算实现
举报原因:
原因补充:

(最多只允许输入30个字)