多项式求值

#include<iostream>
using namespace std;
typedef struct MNode{
	int data;
	struct MNode *next;
}MNode,*MathStack;
typedef struct CNode{
	char data;
	struct CNode *next;
}CNode,*CharStack;
int Switch(char e)
{
	if((e-48)>=0&&(57-e)<=9)
	return e-48;
	else 
	return -1;
}
void PushMath(MathStack &S,int e)
{
	MathStack p;
	p=new MNode;
	p->data=e;
	p->next=S;
	S=p;
}
void PushChar(CharStack &S,char e)
{
	CharStack p;
	p=new CNode;
	p->data=e;
	p->next=S;
	S=p;
}
char GetTop(CharStack S)
{
	return S->data;
}
char Precede(char a,char b)
{
	int i,j;  
    char pre[][7]={            
        {'>','>','<','<','<','>','>'},  
        {'>','>','<','<','<','>','>'},  
        {'>','>','>','>','<','>','>'},  
        {'>','>','>','>','<','>','>'},  
        {'<','<','<','<','<','=','0'},  
        {'>','>','>','>','0','>','>'},  
        {'<','<','<','<','<','0','='}};  
    switch(a){  
        case '+': i=0; break;  
        case '-': i=1; break;  
        case '*': i=2; break;  
        case '/': i=3; break;  
        case '(': i=4; break;  
        case ')': i=5; break;  
        case '#': i=6; break;  
    }  
    switch(b){  
        case '+': j=0; break;  
        case '-': j=1; break;  
        case '*': j=2; break;  
        case '/': j=3; break;  
        case '(': j=4; break;  
        case ')': j=5; break;  
        case '#': j=6; break;  
    }  
    return pre[i][j];  
}  
int PopMath(MathStack &MS)
{
	MathStack p;
	int e;
	p=MS;
	e=MS->data;
	MS=MS->next;
	delete p;
	return e;
}
char PopChar(CharStack &CS)
{
	CharStack p;
	char e;
	p=CS;
	e=CS->data;
	CS=CS->next;
	delete p;
	return e;
}
int Operate(int a,char c,int b)
{
	switch(c)
	{
		case '+':
			a=a+b;break;
		case '-':
			a=b-a;break;
		case '*':
			a=a*b;break;
		case '/':
			a=b/a;break;
	}
	return a;
}
int main()
{
	cout<<"\t\t输入前请确保输入法切换到英文"<<endl;
	cout<<"————————————————————————————"<<endl;
	cout<<"********************************************************"<<endl;
	cout<<"————————————————————————————"<<endl; 
Loop:   cout<<"\t\t本次输入以#为结束标志"<<endl; 
	MathStack MS;
	MS=new MNode;
	MS->next=NULL;
	CharStack CS;
	CS=new CNode;
	CS->next=NULL;
	PushChar(CS,'#');
	int a,b,F;
	char ch,theta;
	cin>>ch;
	while(ch!='#'||GetTop(CS)!='#')
	{
		if(Switch(ch)>=0)
		{
			PushMath(MS,Switch(ch));
			cin>>ch;
		}
		else
		switch(Precede(GetTop(CS),ch))
		{
			case '<':
				PushChar(CS,ch);
				cin>>ch;
				break;
			case '=':
				PopChar(CS);
				cin>>ch;
				break;
			case '>':
				a=PopMath(MS);
				b=PopMath(MS);
				theta=PopChar(CS);
				PushMath(MS,Operate(a,theta,b));
				break;
		}
	}
	cout<<"="<<PopMath(MS)<<""<<endl;
	cout<<"\t\t本次计算完成,退出请按0,继续请按1"<<endl;
	cin>>F;
	if(F)
	{
		cout<<"————————————————————————————"<<endl;
	    cout<<"********************************************************"<<endl;
	    cout<<"————————————————————————————"<<endl; 
	    goto Loop;
	} 
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值