| 首页 | 新闻 | 网页 | 设计 | 色彩 | 原创 | 视觉 | 素材 | 动漫 | 酷站 | 策划 | 文案 | 访谈 | 运营 | 编程 | 数据库 | 服务器 | 下载 | 图库 | 
您的位置: 幽幽天空 > 网页 > 编程开发 > Visual C++教程 > 文章正文 用户登录
用Flash 2004编写
4个数字的混合运算
计算器,按照运算
说说异或运算^和他
AS3.0中is,as运算
Thinking again i
外星代码生成术之
Perl的运算符号字
C++中的运算符重载
对C++递增(增量)运

四则运算实现           

四则运算实现

作者:佚名 来源:CSDN 作者: aivinok 更新:2006-8-25 21:05:35 错误报告 我要投稿
#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
实现四则运算.供大家学习作参考.
文章录入:skyuu    责任编辑:skyuu 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    发表评论:
    姓名:  评 分: 1分 2分 3分 4分 5分
     
  • 严禁发表危害国家安全、政治、黄色淫秽等内容的评论。
  • 用户需对自己在使用幽幽天空服务过程中的行为承担法律责任。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表机友个人观点,与本网站立场无关。