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

📄 2.txt

📁 根据用户输入的中缀表达式
💻 TXT
字号:
#include<iostream.h>
#include<stdio.h>
//////////////////////////////
//程序员:郑泽宇 00846127
//类说明开始
//类功能:
//采用栈的思想生成计算器,实现输入浮点型的表达式求值.
//主要子函数:
//1 栈操作子函数.包括开栈、压栈、出栈、栈清空.
//2 run子函数.实现表达式的输入并将中缀表达式转化为后缀表达式.存储在DTD中.
//3 set子函数.将后缀表达式求值并且输出结果.
//4 compute子函数:在输入过程中对符号进行处理.
//版本:1.0
//类说明结束
/////////////////////////////
class calculate
{
private:
	   double dtd[1000],handle[1000];//dtd用于转化后缀表达式。handle用于后缀表达式求值。
	   int data,top,alg,rec;//data用来记录dtd中当前位置。alg记录操作符。
	   double *list;//定义栈的初始指针
public:
    calculate();//开栈
	void run();
	void clear();
	void push(double c);
	double pop();
	void compute(int alg);
    void compute2();
	void set();
	~calculate();
};
calculate::calculate(void){
	list=new double[1000];;
	top=-1;
	data=0;
}
calculate::~calculate(){
	delete list;
	clear();
}
void calculate::push(double c)
{
	top++;
	list[top]=c;
}//压栈
void calculate::clear()
{
	top=-1;
}
double calculate::pop()
{
	if(top>=0)
	   return list[top--];//判断栈是否为空,不为空则弹出栈顶元素。
}
void calculate::run(void)
{
	char c;
	double temp=0,flag;
	c=getchar();
	rec=0;
	if(c!='\n')//如果最开始输入的就是\n,则不进行操作。
	{
		rec=1;
    while(c!='\n'){
		switch(c){
		//将符号转化为负数数字,便于dtd进行储存。
		case'+':compute(-1);c=getchar();break;
		case'-':compute(-2);c=getchar();break;
		case'*':compute(-3);c=getchar();break;
		case'/':compute(-4);c=getchar();break;
		case'(':push(-5);c=getchar();break;
		case')':compute2();c=getchar();break;
		default:
			flag=0.1;
			temp=0;
			if(c=='.')//判断是否开始即为小数点
			{
				c=getchar();
				while(c>='0'&&c<='9')
				{
					temp+=(c-'0')*flag;
					flag*=0.1;
					c=getchar();
				}
				dtd[data++]=temp;
			}//此处进行小数点后面位数的操作。
			else
			{
				temp=c-'0';
				c=getchar();
				while(c!='.'){
					temp=temp*10+c-'0';
					c=getchar();
				}//小数点之前的录入.
				c=getchar();
				while(c>='0'&&c<='9')
				{
					temp+=flag*(c-'0');
					flag*=0.1;
					c=getchar();
				}//小数点之后的录入.
				dtd[data++]=temp;
			}
		}
	}
	while(top>=0)dtd[data++]=pop();
	}//将符号栈里剩余的符号转入dtd中.
}
void calculate::compute(int alg)
{
	if(top==-1||list[top]==-5) 
		push(alg);//
	else{
		if(alg>=-2)//对加号和减号进行操作
		{
			while(top>=0&&list[top]!=-5)
				dtd[data++]=pop();//循环比较优先级
			push(alg);
		} 
		else{
			if(list[top]>=-2)push(alg);
			else{dtd[data++]=pop();push(alg);}
		}
	}
}
void calculate::compute2(){
	while(list[top]!=-5){
		dtd[data++]=pop();
	}
	top--;//遇到右括号时向前搜寻左括号,并使其中的符号出栈.
}
void calculate::set(){
	int i,j=0;
	for(i=0;i<data;i++)
	{
		if (dtd[i]==-1){j=j-1;handle[j-1]=handle[j-1]+handle[j];}
		else if(dtd[i]==-2){j=j-1;handle[j-1]=handle[j-1]-handle[j];}
		else if(dtd[i]==-3){j=j-1;handle[j-1]=handle[j-1]*handle[j];}
		else if(dtd[i]==-4){j=j-1;handle[j-1]=handle[j-1]/handle[j];}
		else
			handle[j++]=dtd[i];	
	}
	if(rec==1)//检验输入的表达式是否为空。
		printf("%.6lf\n",handle[j-1]);
}
int main(){
	int i;
	printf("由于本程序专为浮点数设计,请您保证输入的操作数是小数形式,谢谢合作.\n");
	for(i=0;i<100;i++){
		calculate now;
		now.run();
		now.set();
	}
	return 0;
}

⌨️ 快捷键说明

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