| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 401 人关注过本帖
标题:栈和队列 表达式的翻版
只看楼主 加入收藏
傻瓜菜
Rank: 2
来 自:earth
等 级:论坛游民
帖 子:73
专家分:66
注 册:2011-10-4
结帖率:94.44%
收藏
已结贴  问题点数:20 回复次数:7 
栈和队列 表达式的翻版
(3+(4*5))-(6)

类似于这样的例子,表达式的某些括号显然是多加的,现在的要求是,如何输出正确的表达式?

请各位大神帮忙看看
搜索更多相关主题的帖子: 表达式 如何 
2012-03-24 11:11
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
递归吧,应该,不过我试了下c语言下写起来有点难,可能用c++的string库写会好多了
2012-03-24 16:25
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:15 
试试这个,用c++的string库写的
程序代码:
#include <iostream>
#include <string>
using namespace std;

int FindNext(string s,int l)
{
    int i,j=1;
    for (i=l+1; i<s.length(); i++)
    {
        if (s[i]=='(') j++; else
        if (s[i]==')') j--;
        if (j==0) return i;
    }
}

int Lowest(string s)
{
    int i=0,j=-1;
    while (i<s.length())
    {
          if (s[i]=='(') i=FindNext(s,i)+1;
          if (s[i]=='+' || s[i]=='-') j=i; else
          if ((s[i]=='*' || s[i]=='/') && (j==-1 || s[j]=='*' || s[i]=='/')) j=i;
          i++;
    }
    return j;
}

int Allnum(string s)
{
    int i;
    for (i=0; i<s.length(); i++)
        if (s[i]<'0' || s[i]>'9') return 0;
    return 1;
}
        
string Cal(string s,char *ch)
{
       int len=s.length();
       if (Allnum(s)) 
       {
                   (*ch)=' ';
                   return s;
       }
       if ((s[0]=='(') &&(FindNext(s,0)==len-1)) 
       {
                       string ss(s,1,len-2);
                       return Cal(ss,ch);
       }
       
       int low=Lowest(s); *ch=s[low];
       string Ls(s,0,low),Rs(s,low+1,len-low);
       char Lch,Rch;
       Ls=Cal(Ls,&Lch); Rs=Cal(Rs,&Rch);
       if (*ch=='+') return Ls+'+'+Rs; 
       else if (*ch=='-')
       {
                       if ((Rch=='+') || (Rch=='-')) return Ls+'-'+'('+Rs+')'; 
                                                  else return Ls+'-'+Rs;
       }
       else if (*ch=='*')
       {
                       if ((Lch=='+') || (Lch=='-')) Ls='('+Ls+')';
                       if ((Rch=='+') || (Rch=='-')) Rs='('+Rs+')';
                       return Ls+'*'+Rs;
       }
       else if (*ch=='/')
       {
                       if ((Lch=='+') || (Lch=='-')) Ls='('+Ls+')';  
                       if (Rch!=' ') Rs='('+Rs+')';
                       return Ls+'/'+Rs;
       }
       
}

int main()
{
    string s;     char ch;
    cin>>s;
    cout<<Cal(s,&ch)<<endl;
    
    system("pause");
    return 0;
}
2012-03-24 17:31
傻瓜菜
Rank: 2
来 自:earth
等 级:论坛游民
帖 子:73
专家分:66
注 册:2011-10-4
收藏
得分:0 
回复 3楼 czz5242199
谢谢答复,可是我没学过C++,我尽量看看,这道题C不能做吗?
2012-03-24 22:31
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
回复 4楼 傻瓜菜
虽然原理一样,但c语言对字符串的处理时通过字符数组来实现的,我写递归的时候程序设定递归函数返回一个字符串,如果用c++可以直接用string类,用c得用字符数组,实现起来极其繁琐
2012-03-24 22:52
nicum
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:180
专家分:712
注 册:2011-2-1
收藏
得分:0 
给你说说思想
两个栈,一个存放运算符,一个存放数
首先 定义运算符的优先性,在压榨的时候,如果现在的运算符的优先性比栈顶运算符优先性高,就不压栈,计算;否者,就压站(出现 ‘(’就压栈)

比如
先定义优先级
char op[]={ '+' , '-' , '*' , '/'')' }
优先级递增
对于式子 (3+(4*5))-(6)
压栈 '(',压栈 3,压栈 '+',压栈 '(',压栈 4,压栈 '*',压栈 '5',
因为 ')'优先级 高于'*'
弹栈 '5',弹栈 '*',弹栈 4,计算 4*5=20,弹栈 '(',一对括号计算完了,压栈 20,
又来一个 ')',弹栈 20,弹栈 '+',弹栈 3,计算 20+3=23,弹栈 '(',压栈 23
压栈 '-',压栈 '(',压栈 6,因为是 ')',弹栈 6,弹栈 '(',压栈 6,
没输入了  弹栈 6,弹栈 '-',弹栈 23,计算 23-6 =17
栈也弹完了 算完了
2012-03-24 22:52
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
回复 6楼 nicum
额、这个不是表达式求值,是剔除表达式中多余的括号
2012-03-24 22:56
nicum
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:180
专家分:712
注 册:2011-2-1
收藏
得分:5 
哦,失误失误,那就更简单了,如果一对括号内的元算符的优先级都比 括号前一个 运算符的优先级高 那么这个括号就是无效的 就删掉
2012-03-24 23:05
快速回复:栈和队列 表达式的翻版
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.103446 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved