您的位置:首页 > 理论基础 > 数据结构算法

数据结构表达式求值有关问题

2015-07-27 21:32 309 查看
<span style="font-size:24px;">数据结构表达式求值问题 求代码
就是数据结构课本(严蔚敏)中栈中的一个问题,算法想的挺简单,不过实现起来着实困难,
例:计算 (3 + 2 * 2(1 + 3))

就是建立两个栈一个字符一个数字   判断读入的是符号还是数据时要用ASCII码吗???  希望高手能给个C的源代码!!!!</span>
<span style="font-size:24px;">#include<iostream>
#include<stack>
#include<cctype>
#include<cstring>
using namespace std;
int isopra(char ch);//判断是不是运算符。
int priority(char ch);//判断优先权。
void trans(char *in,char *out);//将字符串转换成后辍学表达式。
int compute(char *chb);//计算
int reback(char ch,int a,int b);//传入一个运算符一两个数字,返回结果。
int main()
{
char cha[100],chb[100];
cin>>cha;
trans(cha,chb);
cout<<chb<<endl;
cout<<compute(chb);
}
int isopra(char ch)
{
switch(ch)
{
case '+':
case'-':
case'*':
case'/':
case'(':
case')':
case'%':
case'\0':
return 1;
default:
return 0;
}
}
int priority(char ch)
{
switch(ch)
{
case '+':
case'-':
return 1;
case '*':
case '/':
case '%':
return 2;
default :
return 0;
}
}
void trans(char *in,char *out)
{
stack<char>s;
s.push('\0');//设它优先权最低,作栈底。
while(*in!='\0')
{
if(isdigit(*in))*out++=*in++;
//如果是数字,则写入后辍表达式
else if(isopra(*in))
{//如果是操作符,
if(*in=='(')s.push(*in++);//如果是左括号,入栈;
else if(*in==')')
{//如果是右括号,将栈里的符号弹出,直到左括号。
while(s.top()!='(')
{
*out++=s.top();
s.pop();
}
s.pop();//弹出左括号;
in++;//指针移到右括号的后一位。
}
else if(priority(*in)>=priority(s.top()))
{//如果大于栈顶的优先权,入栈。
s.push(*in++);
}
else
{//否则栈顶元素出栈,赋予后辍式。
*out++=s.top();
s.pop();
}
}

}
while(priority('\0')<priority(s.top()))
{//元素全部出栈,给后辍式。
*out++=s.top();
s.pop();
}
*out='\0';//使后辍式成为字符串。
}
int compute(char *chb)
{
stack<int>num;
int a,b;
while(*chb!='\0')
{
if(isdigit(*chb))
{//数字入栈。
num.push(*chb++-'0');
}
else
{//出两个元素出来计算,压入栈。
a=num.top();num.pop();
b=num.top();num.pop();
num.push(reback(*chb,a,b));
chb++;
}
}
return num.top();
}</span><span style="font-size:18px;">
</span><strong><span style="font-size:24px;">int reback(char ch,int a,int b)
{
switch(ch)
{
case '+':return b+a;
case '-':return b-a;
case '/':return b/a;
case '*':return b*a;
case '%':return b%a;
default:return 0;
}
}</span></strong>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: