输入一个表达式字符串求值

描述: 给定一个以字符串形式表示的算术表达式,计算该表达式的值。
表达式支持如下运算:“+、-、*、/”,其中“*”和“/”的优先级要高于“+”和“-”;
不需要考虑括号,且表达式之间没有空格;
例如:对于表达式"3-2+15*2",该表达式值为31.
思路:
1.找到连续的数字字符字串,并转化成整数。
2.算乘除
3.算加减

用双向链表实现


#include <iostream>
#include <string.h>
using namespace std;
typedef struct node 
{
	union intorchar
	{
		int a;
		char c;
	}IntChar;
	bool flag;
	struct node *next;
	struct node *pre;
}Node,*pNode;

int computer(char a[],int len)
{
	int sum=0;
	int k=1;
	pNode pnode =NULL;
	pNode pk=NULL;
	pNode pr=NULL;
	int i1,i2,i3;
	char *p_begin=NULL;
	char *p_end = NULL;
	for (int i=0;i<len;)//将字符串中连续的数字转换成一个字符,没有考虑
	{
		if(a[i]>='0' &&a[i]<<'9')
			if(p_begin ==NULL)
			{
				i1=0;
				
				p_begin =&a[i];
				p_end= p_begin;
				i++;
				for(int j=i;j<len;j++)
					if(a[j]>= '0'&&a[j]<= '9')
					{
						p_end++;
						i++;
					}
					else
						break;
				for(char *p=p_begin ; p<= p_end ; p++)//将字符串转变成整数
				{
					i1=i1*10+(int )((*p)-'0');
				}
				pk = new Node;
				pk->flag =true;
				pk->IntChar.a = i1;
				pk->next =NULL;
				if(NULL==pnode)
				{
					pr=pk;
					pnode =pk;
					pk->pre =NULL;
				}
				else
				{
					pr->next=pk;
					pk->pre =pr;
					pr= pk;
				}
				p_begin =NULL;
				p_end =NULL;
			}
			else
			{;}
		else
		{
			pk = new Node;
			pk->flag =false;
			pk->IntChar.c= a[i++];
			pk->next =NULL;
			if(NULL==pnode)
			{
				pr=pk;
				pnode =pk;
				pk->pre =NULL;
			}
			else
			{
				pr->next=pk;
				pk->pre = pr;
				pr= pk;
			}
		}
	}
	pk=pnode;
	while (pk)
	{
		if (true ==pk->flag )
		{
			cout<<pk->IntChar.a;
		}
		if (false ==pk->flag )
		{
			cout<<pk->IntChar.c;
		}
		pk=pk->next;
	}
	cout<<endl;

	pk=pnode;
	pNode pi=NULL;
	while(pk!=NULL)//找出* /并处理
	{
		if( false == pk->flag && '*'==pk->IntChar.c)
		{
			i1 = (int )pk->pre->IntChar.a;
			i2 = (int )pk->next->IntChar.a;
			i3 = i1*i2;
			pk->pre->IntChar.a =i3;
			if (pk->next->next != NULL)//防止越界
			{
				pk->pre->next =pk->next->next;
				pk->next->next->pre =pk->pre;
				pi= pk;
				pk=pk->next->next;
				delete pi->next;
				delete pi;
				pi= NULL;
			} 
			else
			{
				pk->pre->next= NULL;

				delete pk->next;
				delete pk;
				break;
			}
		}
		else if(false == pk->flag && '/'==pk->IntChar.c)
		{
			i1 = (int )pk->pre->IntChar.a;
			i2 = (int )pk->next->IntChar.a;
			i3 = i1/i2;
			pk->pre->IntChar.a =i3;
			if (pk->next->next != NULL)//防止越界
			{
				pk->pre->next =pk->next->next;
				pk->next->next->pre =pk->pre;
				pi= pk;
				pk=pk->next->next;
				delete pi->next;
				delete pi;
				pi= NULL;
			} 
			else
			{
				pk->pre->next= NULL;
				delete pk->next;
				delete pk;
				break;
			}
		}
		else
		{
			pk=pk->next;
		}
		
	}
	pk=pnode;
	while (pk)
	{
		if (true ==pk->flag )
		{
			cout<<pk->IntChar.a;
		}
		if (false ==pk->flag )
		{
			cout<<pk->IntChar.c;
		}
		pk=pk->next;
	}cout<<endl;
	//处理剩下 + -
	pk=pnode;
	while(pk!=NULL)//找出* /并处理
	{
		if( false == pk->flag && '+'==pk->IntChar.c)
		{
			i1 = (int )pk->pre->IntChar.a;
			i2 = (int )pk->next->IntChar.a;
			i3 = i1+i2;
			pk->pre->IntChar.a =i3;
			if (pk->next->next != NULL)//防止越界
			{
				pk->pre->next =pk->next->next;
				pk->next->next->pre =pk->pre;
				pi= pk;
				pk=pk->next->next;
				delete pi->next;
				delete pi;
				pi= NULL;
			} 
			else
			{
				pk->pre->next= NULL;
				delete pk->next;
				delete pk;
				break;
			}
		}
		else if(false == pk->flag && '-'==pk->IntChar.c)
		{
			i1 = (int )pk->pre->IntChar.a;
			i2 = (int )pk->next->IntChar.a;
			i3 = i1-i2;
			pk->pre->IntChar.a =i3;
			if (pk->next->next != NULL)//防止越界
			{
				pk->pre->next =pk->next->next;
				pk->next->next->pre =pk->pre;
				pi= pk;
				pk=pk->next->next;
				delete pi->next;
				delete pi;
				pi= NULL;
			} 
			else
			{
				pk->pre->next= NULL;
				delete pk->next;
				delete pk;
				break;
			}
		}
		else
		{
			pk=pk->next;
		}	
	}
	pk=pnode;
	while (pk)
	{
		if (true ==pk->flag )
		{
			cout<<pk->IntChar.a;
		}
		if (false ==pk->flag )
		{
			cout<<pk->IntChar.c;
		}
		pk=pk->next;
		
	}cout<<endl;
	sum= pnode->IntChar.a;
	delete pnode;
	return sum;
}
int main()
{
	int sum=0;
	char str[]="3-2+15*20/5";
	sum= computer(str,strlen(str));
	cout<<"sum = "<<sum<<endl;
	return 0;
}


下面是别人做的:

#include <iostream>
#include <string>
#include <stack>

using namespace std;


void cal(char * a){  
    int len = strlen(a);  
    stack<int> s1;  
    stack<char> s2;  
    int k = 0;  
    int sum =0;  
    int sum1 = 0;  
    int count =0;  
	
    while(k <= len){
		
		//把字符串中数字转化成整形存入数组
        if(a[k] <= '9' && a[k] >= '0')
		{  
			sum = 0;  
			while(a[k]<= '9' && a[k] >= '0' )
			{  
				sum = sum * 10 + a[k] - '0';  
				++k;  
			}  
			s1.push(sum);  
        }
		
		else
		{  
			if(!s2.empty())
			{  
                if(s2.top() == '*')
				{  
                    s2.pop();  
                    int number1 = s1.top();  
                    s1.pop();  
                    int number2 = s1.top();  
                    s1.pop();  
                    int tt = 0;  
                    tt = number2 * number1;  
                    s1.push(tt);  
                }
				else if(s2.top() == '/'){  
                    s2.pop();  
                    int number1 = s1.top();  
                    s1.pop();  
                    int number2 = s1.top();  
                    s1.pop();  
                    int tt = 0;  
                    tt = number2 / number1;  
                    s1.push(tt);  
                }  
            }  
            if(k != len){  
                s2.push(a[k]);  
				
            }  
            ++k;  
        }  
    }  
	
	
    sum1 = s1.top();  
    s1.pop();  
    char ch;  
    int temp;  
    while(!s2.empty()){  
        ch = s2.top();  
        temp = s1.top();  
        s1.pop();  
        s2.pop();  
        if(ch == '+'){  
            sum1 = temp + sum1;  
        }else if(ch == '-'){  
            sum1 = temp - sum1;  
        }  
    }  
    cout<<sum1<<endl;  
	
}  


int main()
{
	double sum;
	
	char *a="11+2+18/3/2";
	cal(a);
}


因各个项目中需要使用根据字符串计算数,这里写出一个算法,专门计算字符串。配有大量常用公式。只有一个人方法,直接调用即可。 类名:CustomMath 函数名:Calculations(string value) 说明:解算式表达式字符串 表达式中包含的符号或函数: truncate, ceiling,floor,round,log10, sign,sinh,sqrt, asin,atan,cosh, tanh, sin,cos,tan ,abs,acos, exp,log,max,min,pow,mod,+,-,*,/,',',(,) 函数说明:(不区分大小写) truncate(num) 计算指定数的整数部分 truncate(1.23)=1 ceiling (num) 返回大于或等于指定的双精度浮点数的最小整数 ceiling(1.23)=2 floor(num) 返回小于或等于指定双精度浮点数的最大整数 floor(1.23)=1 round(num) 将双精度浮点舍入为最接近的整数 round(1.23)=1 round(num,num1) 将小数按指定的小数位数舍入 round(1.23,1)=1.2 log10(num) 返回指定数字以 10 为底的对数 log10(10)=1 sign(num) 返回表示数字符号的 sign(1.23)=1 sinh(num) 返回指定角度的双曲正弦 sinh(1.23)=1.5644 sqrt(num) 返回指定数字的平方根 sqrt(9)=3 sqrt(num,num1) 返回指定数字的num1根 sqrt(27,3)=3 asin(num) 返回正弦为指定数字的角度 asin(0.5)=PI/6 atan(num) 返回正切为指定数字的角度 atan(1)=45 cosh(num) 返回指定角度的双曲余弦 cosh(1.23)=1.8567 tanh(num) 返回指定角度的双曲正切 tanh(1.23)=0.8425 sin(num) 返回指定角度的正弦 sin(PI/6)=0.5 cos(num) 返回指定角度的余弦 sin(PI/3)=0.5 tan(num) 返回指定角度的余切 sin(PI/4)=1 abs(num) 返回数字的绝对 abs(-12)=12 acos(num) 返回余弦为指定数字的角度 acos(0.5)=PI/3 exp(num) 返回 e 的指定次幂 exp(1)=2.718 log(num) 返回指定数字的自然对数(底为 e) log(e)=1 log(num,num1) 返回指定数字在使用指定底时的对数 log(e,e)=1 max(num,um1) 返回最大 max(1,2)=2 min(num,num1) 返回最小 min(1,2)=1 pow(num,num1) 返回指定数字的指定次幂 pow(2,2)=4 mod(num,num1) 返回余数 mod(3,2)=1 常量: PI :3.14159265358979323846 E :2.7182818284590452354 YEAR :当前年份 MONTH :当前月份 DAY : 当前日 HOUR :当前时 MINUTE :当前分 SECOND :当前秒 RANDOM :一个随机数(0-1 之间) 实例 系统计算:1+2*3/4-0.5=2 函数计算:1+2*3/4-0.5=2 调用方式:CustomMath.Calculations("1+2*3/4-0.5") 系统计算:(1+2)*3/4-0.5=1.75 函数计算:(1+2)*3/4-0.5=1.75 调用方式:CustomMath.Calculations("(1+2)*3/4-0.5") 系统计算:(sin(pi)+sqrt(3+5*7+(2+8/4*5+2)))/6=1.20185042515466 公式计算:(sin(pi)+sqrt(3+5*7+(2+8/4*5+2)))/6=1.20185042515466 调用方式:CustomMath.Calculations("(sin(pi)+sqrt(3+5*7+(2+8/4*5+2)))/6") 系统计算:sin(pow(3,2)/4)+3.5-9*sqrt(81)=-76.7219268031121 函数计算:sin(pow(3,2)/4)+3.5-9*sqrt(81)=-76.7219268031121 调用方式:CustomMath.Calculations("sin(pow(3,2)/4)+3.5-9*sqrt(81)")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值