永发信息网

C++程序高手请看如何解决?

答案:3  悬赏:0  手机版
解决时间 2021-04-26 18:11

前序表达式求解?哪位高手写个例~非常感谢!

最佳答案

#include"stdio.h"
#include"string.h"


#include<iostreamh>
#define MAX 100
char stack[MAX],new_stack[MAX];
int top=-1,new_top=-1;
int isEmpty(void) ////////////////////
{
if (top==-1) return 1;
else return 0;
}
int push(char data)
{
if (top>=MAX)
{
printf("full error!\n");
return 0;
}
else
{
stack[++top]=data;
return 1;
}
}
int pop(void)
{
if (isEmpty())
{
printf("void error!\n");
return 0;
}
else
{
return stack[top--];
}
}
////////////////////////////////////////////
int new_isEmpty(void)
{
if (new_top==-1) return 1;
else return 0;
}
int new_push(char data)
{
if (new_top>=MAX)
{
printf("new_stack full error!\n");
return 0;
}
else
{
new_stack[++new_top]=data;
return 1;
}
}
int new_pop(void)
{
if (new_isEmpty())
{
printf("new_stack void error!\n");
return 1;
}
else
return new_stack[new_top--];
}
///////////////////////////////////////////////////
int compare(char,char);
void main()
{
int i,n;
char s[MAX]="1+((3))/6";
puts(s);
//gets();
n=strlen(s);
push(' ');
for (i=n-1;i>=0;i--)
{


switch (s[i])
{
case '(': while (!isEmpty())
{
if (stack[top]==')') break;
else new_push(pop());//printf("%c",pop());
}
top--; break;
case ')': push(s[i]);break;
case '+':
case '-':
case '*':
case '/':
case '^': if (compare(s[i],stack[top])==1)
{
new_push(pop());//printf("<%c>",stack[top]);
push(s[i]);
}
else push(s[i]);
break;
default : new_push(s[i]);break;//printf("%c",(s[i]));break;
}
}
while (!isEmpty()) new_push(pop());
printf("\nOuput:");
while (!new_isEmpty()) printf("%c",new_pop());
printf("\n");
}
////////////////////////////////////////////
int compare(char data,char stack)
{
char sign[7];
int data_i=0,stack_j=0;
sign[0]=' ';
sign[1]=')';
sign[2]='+';
sign[3]='-';
sign[4]='*';
sign[5]='/';
sign[6]='^';
while (sign[data_i]!=data) data_i++;
while (sign[stack_j]!=stack) stack_j++;
return (stack_j/2>=data_i/2) ? 1:0;
}


此C程序转换C++只需在前加using namespace std;


cin>>----scanf("%d",&x) //d为数据类型,x为对象


cout<<------printf("%d",x)

全部回答

可以由这个中序表达式,直接根据优先级建2个栈(运算符栈和数据栈),(可以参照数据结构严蔚敏版第53页,优先级表也在上面)。

还可以通过找到表达式的逆波兰式(后缀表达式)来求,这个方法只需建立一个数据栈来解决。关键的问题是如何将中序表达式转换成逆波兰式。可以用栈来建,也可以用二叉树建,二叉树的后序遍历就是逆波兰式,但二叉树建立比栈要复杂,这里我用栈来建。算法如下:

1. 如果是数字,则直接写入存储器,注意要将不同的数字分开,我用空格隔开了,比如说12就是“12 ”,1+2就是“1 2 ”。

2. 如果是左括号"(",则直接入符号栈;

3. 如果是右括号")",则弹出符号栈数据,写入存储器,直到左括号弹出;

4. 如果是普通运算符,则与栈顶符号比较优先级,若大于栈顶优先级,则入栈;否则弹出栈顶符号并写入存储器,直到栈顶符号的运算优先级较小为止(这里要注意优先级和数据结构书上的有些区别,左括号要单独考虑,这里我调试了半天才发现)

6. 如果是结束符(表示表达式已全部读完),则符号栈全部弹出并写入存储器,否则读取数据进入下个过程。

下面是我编的代码,只基于理论的实现,没有考虑程序的健壮性,而且只能实现正整数的加减乘除运算(即输入时不能带单目运算符“-”,因为程序中的负号按双目运算符减号处理了),表达式必须以“#”结束。程序可以进一步优化,比如说可以带单目运算符,以回车结束,自动生成“#”等,浮点数的运算大概就比较难了,还没有想好。。。

#include<iostream> #include<stack> #include<map> using namespace std;

class YouXian { public: static int compare(char c1,char c2) { if(ma.empty()) init(); return ma[make_pair(c1,c2)]; } private: static map<pair<char,char>,int> ma; static void init(); }; map<pair<char,char>,int> YouXian::ma; void YouXian::init()//建立优先级的映射集合 { ma.insert(make_pair(make_pair('+','+'),1)); ma.insert(make_pair(make_pair('+','-'),1)); ma.insert(make_pair(make_pair('+','*'),2)); ma.insert(make_pair(make_pair('+','/'),2)); ma.insert(make_pair(make_pair('+','('),2)); ma.insert(make_pair(make_pair('+',')'),1)); ma.insert(make_pair(make_pair('+','#'),1)); ma.insert(make_pair(make_pair('-','+'),1)); ma.insert(make_pair(make_pair('-','-'),1)); ma.insert(make_pair(make_pair('-','*'),2)); ma.insert(make_pair(make_pair('-','/'),2)); ma.insert(make_pair(make_pair('-','('),2)); ma.insert(make_pair(make_pair('-',')'),1)); ma.insert(make_pair(make_pair('-','#'),1)); ma.insert(make_pair(make_pair('*','+'),1)); ma.insert(make_pair(make_pair('*','-'),1)); ma.insert(make_pair(make_pair('*','*'),1)); ma.insert(make_pair(make_pair('*','/'),1)); ma.insert(make_pair(make_pair('*','('),2)); ma.insert(make_pair(make_pair('*',')'),1)); ma.insert(make_pair(make_pair('*','#'),1)); ma.insert(make_pair(make_pair('/','+'),1)); ma.insert(make_pair(make_pair('/','-'),1)); ma.insert(make_pair(make_pair('/','*'),1)); ma.insert(make_pair(make_pair('/','/'),1)); ma.insert(make_pair(make_pair('/','('),2)); ma.insert(make_pair(make_pair('/',')'),1)); ma.insert(make_pair(make_pair('/','#'),1)); ma.insert(make_pair(make_pair('(','+'),2)); ma.insert(make_pair(make_pair('(','-'),2)); ma.insert(make_pair(make_pair('(','*'),2)); ma.insert(make_pair(make_pair('(','/'),2)); ma.insert(make_pair(make_pair('(','('),2)); ma.insert(make_pair(make_pair('(',')'),0)); ma.insert(make_pair(make_pair('(','#'),3)); ma.insert(make_pair(make_pair(')','+'),1)); ma.insert(make_pair(make_pair(')','-'),1)); ma.insert(make_pair(make_pair(')','*'),1)); ma.insert(make_pair(make_pair(')','/'),1)); ma.insert(make_pair(make_pair(')','('),3)); ma.insert(make_pair(make_pair(')',')'),1)); ma.insert(make_pair(make_pair(')','#'),1)); ma.insert(make_pair(make_pair('#','+'),2)); ma.insert(make_pair(make_pair('#','-'),2)); ma.insert(make_pair(make_pair('#','*'),2)); ma.insert(make_pair(make_pair('#','/'),2)); ma.insert(make_pair(make_pair('#','('),2)); ma.insert(make_pair(make_pair('#',')'),3)); ma.insert(make_pair(make_pair('#','#'),0)); }

class YunSuan { public: YunSuan(){optr.push('#');} void ZhongXu();//用运算符栈及数据栈进行计算 private: stack<char> optr;//运算符栈 stack<int> opnd;//数据栈 int compute(int n1,char c,int n2); };

int YunSuan::compute(int n1,char c,int n2) { int ans; switch(c) { case '+':ans=n1+n2;break; case '-':ans=n1-n2;break; case '*':ans=n1*n2;break; case '/':ans=n1/n2;break; } return ans; }

void YunSuan::ZhongXu() { char c; c=getchar(); char temp; int temp1,temp2; bool flag=false; while(c!='#'||optr.top()!='#') { if(c>='0'&&c<='9') { if(flag==false) { opnd.push(c-'0'); flag=true; } else { temp1=opnd.top(); opnd.pop(); opnd.push(temp1*10+c-'0'); } c=getchar(); } else if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#') { flag=false; switch(YouXian::compare(optr.top(),c)) { case 2:optr.push(c);c=getchar();break; case 0:optr.pop();c=getchar();break; case 1:temp=optr.top();optr.pop();temp1=opnd.top();opnd.pop(); temp2=opnd.top();opnd.pop();opnd.push(compute(temp2,temp,temp1));break; } } else { cerr<<"存在非法字符"<<endl; exit(1); } } cout<<opnd.top()<<endl; }

class Nibolan { public: void Houxu();//用逆波兰式求表达式 void Gouzao();//将中序表达式转化为逆波兰式 int compute(int n1,char c,int n2); private: string s; stack<char> st; stack<int> shuju; };

void Nibolan::Gouzao() { char c; bool flag=false;//标记是否是一个数据的输入是否结束,在s中用空格符体现 c=getchar(); while(c!='#') { if(c>='0'&&c<='9') { s+=c; flag=true; c=getchar(); } else if(c=='(') { if(flag) { flag=false; s+=' '; } st.push(c); c=getchar(); } else if(c==')') { if(flag) { flag=false; s+=' '; } while(st.top()!='(') { s+=st.top(); st.pop(); } st.pop(); c=getchar(); } else if(c=='+'||c=='-'||c=='*'||c=='/') { if(flag) { s+=' '; flag=false; } if(!st.empty()) { while(YouXian::compare(c,st.top())==2) { if(st.top()=='(')//遇到左括号就退出循环,这里左括号和中序表达式的优先级有些不一样 break; s+=st.top(); st.pop(); if(st.empty()) break; } } st.push(c); c=getchar(); } else { cerr<<"存在非法字符"<<endl; exit(1); } } while(!st.empty()) { if(flag) { s+=' '; flag=false; } s+=st.top(); st.pop(); } s+='#'; }

void Nibolan::Houxu() { Gouzao(); int temp1,temp2; int sum=0; for(int i=0;s[i]!='#';++i) { if((s[i]>='0'&&s[i]<='9')||s[i]==' ') { if(s[i]==' ') { shuju.push(sum); sum=0; } else sum=sum*10+s[i]-'0'; } else { temp1=shuju.top(); shuju.pop(); temp2=shuju.top(); shuju.pop(); shuju.push(compute(temp2,s[i],temp1)); } } cout<<shuju.top()<<endl; }

int Nibolan::compute(int n1,char c,int n2) { int ans; switch(c) { case '+':ans=n1+n2;break; case '-':ans=n1-n2;break; case '*':ans=n1*n2;break; case '/':ans=n1/n2;break; } return ans; }

int main() { YunSuan A; cout<<"请输入表达式,以#结束"<<endl; A.ZhongXu();//中序表达式直接求解 getchar(); cout<<"请输入表达式,以#结束"<<endl; Nibolan B; B.Houxu();//用逆波兰式求解 return 0; }

问题没有描述清楚,请说具体点~谢谢!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
dota幻影刺客
手机不带手机qq,也没法下,如何才能装象那些
如何灭掉所有图标
桐乡哪里能打工。。是暑期工
光明小区-东门地址有知道的么?有点事想过去
沈阳哪里有喜来妮皮衣清洗连锁店
今年中秋国庆能连一快放吗
为什么下载视频到MP4里面,打开MP4里面却没有
男生纹理烫做个一般的大概是什么价位?
冬季是不是比较容易长胖?
锦包子地址在哪,我要去那里办事
淘宝号在哪里可以买到,哪里可以买淘宝账号的
开通国内移动数据时点的是次日生效,但是查询
上移动无线网卡,一个小时最废流量能废多少?估
怀36周,宝宝入盆了大概多久生?
推荐资讯
虎年男宝宝取明
征途我厉害吗?
怎样得到XP密钥
京润珍珠的护肤品,适合二十岁的肤质吗?有什
第一乐章地址在什么地方,想过去办事
我QQ被盗了QQ游戏被封到了2046年有什么办法能
求一首男女对唱歌
在ipod touch3 里下载音乐或电影一定要用iTun
男人活着为了什么?谁能解释下!!
求几个笑话?
谁能给个PPT背景素材下载啊?
猕猴桃和什么水果放一起容易熟?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?