简易计算器:为什么输入形如2*(3-1)的式子时,输出总是13呢
  • 板块学术版
  • 楼主yxsl
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/5/31 23:02
  • 上次更新2023/10/23 14:11:54
查看原帖
简易计算器:为什么输入形如2*(3-1)的式子时,输出总是13呢
802842
yxsl楼主2023/5/31 23:02
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2
#define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int Status;
typedef char SElemType;

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;
}

char GetTop(SqStack S,SElemType &e)
{
	if(S.top==S.base)return ERROR;
	else e=*(S.top-1);
	return e;
}

Status Push(SqStack &S,SElemType e)
{
	if(S.top-S.base>=S.stacksize)
	{
		S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
		if(!S.base)exit(OVERFLOW);
		S.top=S.base+S.stacksize;
		S.stacksize+=STACKINCREMENT;
	}
	*S.top++=e;
	return OK;
}

Status Pop(SqStack &S,SElemType &e)
{
	if(S.base==S.top)return ERROR;
	else e=*--S.top;
	return OK;
}

int StackLength(SqStack S)
{
	return S.top-S.base;
}

int isint(char c)//判断是否是整数 
{
	if('0'<=c&&c<='9')return 1;
	else return 0;
}

char Precede(char t,char c)//判断算符优先级 ,t是栈顶算符 
{
	switch(t)
	{
		case '+':
		case '-':if(c=='*'||c=='/'||c=='()')return '<';else return '>';
		case '^':
		case '*':
		case '/':if(c=='()')return '<';else return '>';
		case '(':if(c==')')return '=';else return '<';
		case ')':return '>';
		case '=':if(c=='=')return ';';else return '<';	
	}
}

int Mi(int a,int b)//求幂a^b 
{
	int i,a0;
	a0=a;
	for(i=1;i<b;i++)
	{
		a*=a0;
	}
	return a;
}

int Operate(int a,char theta,int b)//进行计算 
{
//	printf("##%d##%d",a,b);
	switch(theta)
	{
		case '+':return a+b+'0';
		case '-':return a-b+'0';
		case '*':return a*b+'0';
		case '/':return a/b+'0';
		case '^':return Mi(a,b)+'0';		
	}
}

int main()
{
	SqStack RAND,TOR;
	char c,e,x,a,b,theta;
	
	InitStack(RAND);//算子 
	InitStack(TOR); //算符
	Push(TOR,'=');
	c=getchar();
	
	while(c!='='||GetTop(TOR,x)!='=')
	{
		GetTop(TOR,e);
		if(isint(c))
		{
			Push(RAND,c);
			c=getchar();
		}
		else
		{
			switch(Precede(e,c))//e是栈顶算符,c是输入算符 
			{
				case ';':Pop(TOR,x);break;
				case '<':Push(TOR,c);c=getchar();break;
				case '=':Pop(TOR,x);c=getchar();break;
				case '>':Pop(TOR,theta);Pop(RAND,b);Pop(RAND,a);Push(RAND,Operate(a-'0',theta,b-'0'));break;
			}
		}

	} 
	while(StackLength(RAND)>1) 
	{
		Pop(TOR,theta);Pop(RAND,b);Pop(RAND,a);Push(RAND,Operate(a-'0',theta,b-'0'));
	}
	Pop(RAND,e);
	printf("%d",e-'0'); 
	
return 0;	
} 

2023/5/31 23:02
加载中...