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

📄 bdsqz3.cpp

📁 这是一个表达式求值的C++源代码,希望对有需要的人有所帮助.里面写的很详细.
💻 CPP
字号:
#define N 50
#include<stdio.h>
#include<stdlib.h>
#include <ctype.h>
#include <string.h>
typedef struct{
	int top;
	double array[N];
}NumStack;             //存放实数的栈
typedef struct{
	int top;
	char array[N];
}OpStack;              //存放操作符的栈
int Cint(char mychar)  //把字符转换为相应的整数的函数
{
	return (mychar-48);
}
void PushNum(NumStack *numstack,double num)  //数字进栈的函数
{
	numstack->top++;
    numstack->array[numstack->top-1]=num;
}
void PopNum(NumStack *numstack,double *num)   //数字出栈的函数
{
	*num=numstack->array[numstack->top-1];
	numstack->top--;
}
void PushOp(OpStack *opstack,char op)        //操作符进栈的函数
{
	opstack->top++;
	opstack->array[opstack->top-1]=op;
}
void PopOp(OpStack *opstack,char *op)        //操作符出栈的函数
{
	*op=opstack->array[opstack->top-1];
	opstack->top--;
}
double Calc(double a,double b,char c)        //进行运算的函数
{
	double result;
	switch(c)
	{
	case '+':result=a+b;break;
	case '-':result=a-b;break;
    case '*':result=a*b;break;
    case '/':result=a/b;break;
	}
    return result;
}
char Priority(char y,char x)                //判断优先级的函数
{
	char priority='<';
    switch(x)
	{
    case '+':
    case '-':if(y=='(' || y=='#')priority='>';break;
    case '*':
    case '/':if(y=='(' || y=='#'|| y=='+' || y=='-')priority='>';break;
    case '(':priority='>';break;
    case ')':if(y=='(')priority='=';break;
    case '#':if(y=='#')priority='=';break;
    default:priority='E';
	}
    return priority;
}
void Process(NumStack *numstack,OpStack *opstack,char x)       //处理表达式的主体函数
{
	double a,b;char c;
    static double tempnum=0;static int len=10;static int dot=0,flags=0;
    if(isdigit(x) || x=='.')            //如果x是数字或小数点就进入这里 
	{
		if(x=='.')dot=1;                //如果x是小数点就把小数点标志置1
        else{                           //如果x是数字则进入这里
			if(dot==0)                  //如果当前还没有接受过小数点
				tempnum=tempnum*10+Cint(x);   //生成整数部分  
			else{                             //如果当前已经接受过小数点
				tempnum=tempnum+(double)Cint(x)/len;    //生成小数部分
                len*=10;
			}
		}
	}
   else{
	   if(flags==0 && x!='('){
		   PushNum(numstack,tempnum);
		   tempnum=0;
		   len=10;
		   dot=0;
	   }
	   switch(Priority(opstack->array[opstack->top-1],x)){
	   case '>':PushOp(opstack,x);flags=0;break;
       case '<':PopOp(opstack,&c);       //退栈并将运算结果入栈
                PopNum(numstack,&b);
                PopNum(numstack,&a);
                PushNum(numstack,Calc(a,b,c));
				flags=1;
                Process(numstack,opstack,x);break;
       case '=':PopOp(opstack,&c);flags=1;break;
       default:printf("这个表达式是错误的!");exit(0);
	   }
   }
}
void main(void)
{
	char ch;
	char s[N];int i=0;
	NumStack numstack;OpStack opstack;
    numstack.top=0;opstack.top=0;
    PushOp(&opstack,'#');             //菜单
               
    printf("                         ****************************                           ");
    printf("                         *这是一个表达式求值的小程序*                           ");
	printf("                         *                          *                           ");
	printf("                         *       S: 进入程序        *                           ");
	printf("                         *       E: 退出程序        *                           ");
	printf("                         ****************************                           ");
	printf("\n");
	printf("请输入选择并回车:");
	scanf("%c",&ch);
	ch=toupper(ch);      //如果是小写的转换成大写字母
	switch(ch)
	{
	case'S':
		printf("\n请输入你的运算表达式并以#号结束: ");scanf("%s",s);
        for(i=0;i<strlen(s);i++)//+++++
	    Process(&numstack,&opstack,s[i]);
        printf("计算后的结果是: %f\n",numstack.array[numstack.top-1]);
		//system("pause");
		break;
	case'E': break;
	}
	  
    /*printf("\n请输入你的运算式并以#号结束:");
	scanf("%s",s);
    for(i=0;i<strlen(s);i++)//+++++
		Process(&numstack,&opstack,s[i]);
    printf("计算后的结果为: %f",numstack.array[numstack.top-1]);*/
}

⌨️ 快捷键说明

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