⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f-houzhui.cpp

📁 中缀表达求后缀表达式及其值
💻 CPP
字号:
#include<stdlib.h>
#include<string.h>
#include<iostream.h>

int track_pre(char in)
{
	switch(in)
	{
	case '#':
	case '(':return 0;break;
	case '+':
	case '-':return 2;break;
	case '*':
	case '/':return 4;break;
	case ')':return 5;break;
	default:cout<<"input error!!"
				<<endl;
		return -1;
	}
}
	   
int sign_pre(char in,bool &key)
{
	switch(in)
	{
	case '#':
	case ')':return 0;break;
	case '+':
	case '-':return 1;break;
	case '*':
	case '/':return 3;break;
	case '(':return 5;break;
	default:cout<<"input error!!"<<endl;
		key=false;
		return 6;
	}
}

void count(double*num,int&top,char sym)
{
	double tem;
	if(top<=1)
		cout<<"输入错误!!!"<<endl;
	else
	{
		tem=num[top];
		top--;

		switch(sym)
		{
		case '+':num[top]+=tem;break;
		case '-':num[top]-=tem;break;
		case '*':num[top]*=tem;break;
		case '/':num[top]/=tem;break;
		default:cout<<"error!!!"<<endl;
		}
	}
}

bool findnum(char*&exp,double*num,int&top,bool first)
{
	char tra;
	char str[20];
	char *p=str;
	bool find=false;

	tra=*exp;
	if(tra=='-'&&(*(exp-1)=='('||first))
	{
		*p=tra;
		p++;
		exp++;
	}
	while(true)
	{
		tra=*exp;
		if(tra>='0'&&tra<='9'||tra=='.')
		{			
			*p++=tra;
			exp++;
			find=true;
		}
		else 
		{
			if(find)
			{
				*p='\0';
				top++;
				num[top]=atof(str);
			}
			break;
		}
	}
	if(find)
		return true;
	else
		return false;
}

double translate(char *exp)
{
	char TRACK[20];
	int top=0;
	double *num;
	int head=0;
	char tra;
	bool first=true;
	bool key=true;
	bool space=false;
	
	num=new double[20];
	TRACK[top]='#';
	num[head]=0.0;

	while(key)
	{
	
		if(findnum(exp,num,head,first))
		{
			if(space)
				cout<<",";
			cout<<num[head];
			space=true;
		}
		
		tra=*exp++;
		if(first)
			first=false;
		
		switch(tra)
		{
		case '#':while(top>0)
				 {
					 cout<<TRACK[top];
					 count(num,head,TRACK[top]);
					 top--;
				 }
				cout<<"#";
				key=false;break;
		case ')':while(TRACK[top]!='(')
				 {
					 cout<<TRACK[top];
					 count(num,head,TRACK[top]);
					 top--;
					 space=false;
				 }
				top--;break;
		default:while(track_pre(TRACK[top])>=sign_pre(tra,key))
				{
					cout<<TRACK[top];
					count(num,head,TRACK[top]);
					top--;
					space=false;
				}
				top++;
				TRACK[top]=tra;break;
		}
	}
	if(head!=1)
		cout<<"error!!!"<<endl;
	return num[head];
}
void main()
{
	char exp[80];
	double resault;
	
	cout<<"<<<<<<<请输入中缀表达式>>>>>>>"<<endl
		<<"-------------^_^--------------"<<endl
		<<"  =>";
	cin>>exp;
	cout<<"--------------OK--------------"<<endl<<endl;
	if(*(exp+strlen(exp)-1)!='#')
		cout<<"输入错误!!!"<<endl;
	else
	{
		cout<<"*******该式后缀表达式为*******"<<endl
			<<"-------------^_^--------------"<<endl
			<<"  =>";

		resault=translate(exp);
		cout<<endl<<"------------result------------"<<endl;
		cout<<" 该式的结果=>"<<resault;
		cout<<endl<<"-----------competed-----------"<<endl;
	}
	cin>>exp;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -