m0_56119117 2021-06-15 11:19 采纳率: 0%
浏览 5

表达式运算:请问哪里出了问题,为什么一直没有结果

#include "stdafx.h"
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define STACKINCREMENT 10

#define STACK_INIT_SIZE 100
typedef int Status;
typedef struct 
{
	char *base;
	char *top;
	int stacksize;
}OPTRStack;    //操作符栈

typedef struct
{
	int *base;
	int *top;
	int stacksize;
}OPNDStack;     //操作数栈

Status Init(OPTRStack &S)
{
	S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
	if(!S.base) exit(OVERFLOW);
	S.top=S.base;
	S.stacksize=STACK_INIT_SIZE;
	return OK;
}    //初始化操作符栈
Status Init(OPNDStack &S)
{
	S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));
	if(!S.base) exit(OVERFLOW);
	S.top=S.base;
	S.stacksize=STACK_INIT_SIZE;
	return OK;
}//初始化操作数栈
char GetTop(OPTRStack S)
{
	char e;
	if(S.top==S.base) return ERROR;
	return e=*(S.top-1);
}//若操作符栈不空,则用e返回栈的栈顶元素
int GetTop(OPNDStack S)
{
	int e;
	if(S.top==S.base) return ERROR;
	return e=*(S.top-1);
}//若操作数栈不空,则用e返回栈的栈顶元素
Status Push(OPTRStack &S,char e)
{
	if(S.top-S.base>=S.stacksize)
	{
		S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
		if(!S.base) exit(OVERFLOW);
		S.top=S.base+S.stacksize;
		S.stacksize+=STACKINCREMENT;
	}
	*S.top++=e;
	return OK;
}//进操作符栈
int Push(OPNDStack &S,int e)
{
	if(S.top-S.base>=S.stacksize)
	{
		S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
		if(!S.base) exit(OVERFLOW);
		S.top=S.base+S.stacksize;
		S.stacksize+=STACKINCREMENT;
	}
	*S.top++=e;
	return *S.top;
}//进操作数栈
char Pop(OPTRStack &S)
{
	if(S.top==S.base) return '0';
	 return *--S.top;
	 
}//出操作符栈
int Pop(OPNDStack &S)
	{
		int e;
	if(S.top==S.base) return ERROR;
	e=*--S.top;
	return e;
}//出操作数栈
Status Judge(char c)
{
	if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#') return OK;
	else return ERROR;
}//若c是这五个字符之一,则返回OK;否则返回ERROR
char Compare(char a,char b)
{
	if(a=='+')
	{
		if(b=='*'||b=='/'||b=='(') return '<';
		else return '>';
	}
	else if(a=='-')
	{
		if(b=='*'||b=='/'||b=='(') return '<';
		else return '>';
	}
	else if(a=='*')
	{
		if(b=='(')return '<';
		else return '>';
	}
	else if(a=='/')
	{
		if(b=='(')return '<';
		else return '>';
	}
	else if(a=='(')
	{
		if(b==')')return '=';
		else if(b=='#') return '0';
		else return '<';
	}
	else if(a==')')
	{
		if(b=='(')return '0';
		else return '>';
		
	}
	else if(a=='#')
	{
		if(b==')')return '0';
		if(b=='#')return '=';
		else return '<';
	}
}//运算符的自定义优先级比较
int Calculate(int left,int right, char operators)
{ 
	if(operators=='+') return left+right;
	else if(operators=='-') return left-right;
	else if(operators=='*') return left*right;
	else if(operators=='/')
	{
		if(right==0) {printf("Attention:denominatotr cannot be '0'\n");return 0;}
		else return left/right;
	}
}//计算
void Fun(OPTRStack &OPTR,OPNDStack &OPND,char c)
	{
		if(Compare(GetTop(OPTR),c)=='<')
		{
			 Push(OPTR,c);
			c=getchar();
		}
		else if(Compare(GetTop(OPTR),c)=='=')
		{
			if(c!='#')
			{Pop(OPTR);
			c=getchar();}
			else
				printf("The Answer is:%d\n",GetTop(OPND));
		}
	    else if(Compare(GetTop(OPTR),c)=='>')
	    {
			int left,right;
			char operators=Pop(OPTR);
		    right=Pop(OPND);
			left=Pop(OPND);
			Push(OPND,Calculate(left,right,operators));
		    Fun(OPTR,OPND,c);
	    }
    }
void f(OPTRStack OPTR,OPNDStack OPND,int *p1,int *p2,char c)
{
	c=getchar();
		while(!Judge(c))
		{
			int top;
	        top=GetTop(OPND);
         	p1=&top;
			int b=c-48;
			p2=&b;
			Pop(OPND);
			Push(OPND,(*p1)*10+(*p2));
			c=getchar();
		}
		//printf("%d\n",GetTop(OPND));
}
int main()
{
	OPTRStack OPTR;    //操作符栈
	OPNDStack OPND;    //操作数栈
	int a;
	char b;
		int *p1,*p2;
		p1=(int*)malloc(sizeof(int));
    	p2=(int*)malloc(sizeof(int));
	Init(OPTR);
	Init(OPND);
	printf("Please input expression(以“#”结束):\n");
	Push(OPTR,'#');
	char c;   
	c=getchar();//输入第一个字符
	while(c!='#'||GetTop(OPTR)!='#')   //遇到'#'跳出while语句
	{
		if(Judge(c))  {
			a=c-48;
		   Push(OPND,a);
		   f(OPTR,OPND,p1,p2,c);
		} //c是操作符
	else{ 
	Fun(OPTR,OPND,c);
	}  //c是操作数
	}
	printf("The answer=%d",GetTop(OPND));
	getchar();
	return OK;}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-07 19:10
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!