免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4246 | 回复: 12
打印 上一主题 下一主题

猫小请进,一个有关stringtokenizer的难题. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-12 06:52 |只看该作者 |倒序浏览
大家好,小弟java才起步不久. 老师给我出了一道题,可是我想了很久,都没有办法通过.眼看后天就要交货了,希望大家拉小弟一把. 谢谢了
    问题是这样的:           编译一个实现可以实现四则运算的程序,
当输入一端 字符串 (ex:  4*(4+2/5)()) 可以得出正确的计算结果.
算法如下
              E = T ("+" | "-"T *;
                     T = F ("*" | "/"F *;
                     F = NUMBER | ("(" E "";
这三部分基本用stringtokenizer 可以实现,  请各位高手指点,如需更多信息,我再提供

论坛徽章:
0
2 [报告]
发表于 2004-12-12 07:06 |只看该作者

猫小请进,一个有关stringtokenizer的难题.

E = T ("+" | "-"T *;
T = F ("*" | "/"F *;
F = NUMBER | ("(" E "";
什么意思?

论坛徽章:
0
3 [报告]
发表于 2004-12-12 07:07 |只看该作者

猫小请进,一个有关stringtokenizer的难题.

我看还是把我的程序给大家也看看吧, 存在许多问题,希望大家指正.
   因为写的比较乱, 疯狂测试中,所以要费大家的眼力了
   
/*
* Created on 2004-12-10
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package tableur;

import java.util.NoSuchElementException;
import java.util.StringTokenizer;

/**
* @author 莫名其道
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class Select {
    private String in = "";
    private String out= "";
    private StringTokenizer dev;
    private String token = "";
        /**
         * @param string
         */
        public Select(String string) {
                in = string;
                // TODO Auto-generated constructor stub
               
        }
        /**
         * @return
         */
        public String select() {
                // TODO Auto-generated method stub
                dev = new StringTokenizer(in , "/+*-()" , true);
                while(dev.hasMoreTokens())
                {
                        out = parseE();              output("out=",out);
                }
                return out;
        }
        /**
         * @return
         */
        private void output(String t, String t2) {
                // TODO Auto-generated method stub
                System.out.println(t + t2);
                return;
        }
       
        String parseE() {
        String t = parseT();                               output("Et=",t);
           token = parseT();                      output("Etoken=",token);
        while (token.equals("+"||token.equals("-") {
        String t2 = parseT();
        if (token.equals("+") {
                t = cal(t,token,t2);                           output("addt=",t);
        } else {
                if(token.equals("-")
                   t = cal(t,token,t2);                        output("subt=",t);
        }
        token = getNext("+-";                             output("Etoken'=",token);
        }
        return t;                                          
        }


String parseT() {
        String t = parseF();                                 output("Tt=",t);
        //  token = parseF();                        output("Ttoken=",token);
        while (token.equals("*"||token.equals("/") {
        String t2 = parseF();                                output("t2=",t2);
        if (token.equals("*") {
             t = cal(t,token,t2);                            output("mult=",t);
        } else {
          if(token.equals("-")
             t = cal(t,token,t2);                            output("devt=",t);
        }
        token = parseF();                               output("Ttoken'=",token);
        }                                                    output("Tt'=",t);
        return t;                                            
}
       
        String parseF() {
        token = getNext("+*-/()";                   output("Ftoken-=",token);
        while(token.equals("(") || token.equals(")")){
           if (token.equals("(")) {
             String t = parseE();                            output("(t)=",t);
             token = getNext("+/*-()");                          output("t)=",token);
             if(!token.equals(")"))
              return "#Error";
             return  t;}
             token = parseE();
               return token;
        } //else {                                             output("Ftoken'=",token);
        //return token;                                       
        //}
        //}
        return token;
        }
       
       
       
        /**
         * @param string
         * @return
         */
        private String getNext(String as) {
                // TODO Auto-generated method stub
                String next;
                try{next = dev.nextToken(as);}
                catch(NoSuchElementException e)
                {return   "";
                        }
                return next;
                }
               
       
/**
         * @param t
         * @param token
         * @param t2
         * @return
         */
        private String cal(String t, String token, String t2) {
                // TODO Auto-generated method stub
                int n = Integer.parseInt(t);
                int m = Integer.parseInt(t2);
                if(token.equals("+"))
                        n = n + m;
                else if(token.equals("-"))
                        n = n - m;
                else if(token.equals("*"))
                        n = n * m;
                else
                        n = n / m;
                return n + "";
        }
}

论坛徽章:
0
4 [报告]
发表于 2004-12-12 07:11 |只看该作者

猫小请进,一个有关stringtokenizer的难题.

就是三个方法啊
    分别实现  + -
                      */
                      ()

论坛徽章:
0
5 [报告]
发表于 2004-12-12 16:42 |只看该作者

猫小请进,一个有关stringtokenizer的难题.

是提的不好么?怎么还没人回啊,也许是简单,但对于初学者要用好也不容易.大家如果觉的有什么地方做的不够的,尽管可以说,也不要一声不吭的就让我的贴子沉下去啊.

论坛徽章:
0
6 [报告]
发表于 2004-12-13 07:57 |只看该作者

猫小请进,一个有关stringtokenizer的难题.

这儿见过一个爆经典的例子,是俺见过的很强的解决方案:
select '(1+2*6/5)' from temptable;

给我的第一感觉就是:佩服!

其它方法就复杂了,比如楼主想的。
有个经典的例子C版的。刚学编程的时候接触过。用堆栈来完成这个处理。

论坛徽章:
0
7 [报告]
发表于 2004-12-13 13:40 |只看该作者

猫小请进,一个有关stringtokenizer的难题.

我写了伪码,没有写java代码,不过你可以看看。
一共三部分,测试表达式是否符合要求,中缀式转换成后缀式,后缀式求值
[code]
I. Validate test pseudocode

Algorithm validate_start_element(EL):
        Input: a state sign from Q
        Output: boolean value that indicates whether the EL is valid
        if EL<>;b  or  EL<>;e  or  EL<>;c then
                throw an InvalidExpressionException

Algorithm validate_finish_element(EL):
        Input: a state sign from Q
        Output: boolean value that indicates whether the EL is valid
        if EL<>;b  or   EL<>;d then
                throw an InvalidExpressionException

Algorithm validate_successive_two_elements(EL1, EL2):
        Input: successive two state signs EL1 and EL2 from Q
        Output: boolean value that indicates whether the EL is valid
        EL

论坛徽章:
0
8 [报告]
发表于 2004-12-13 18:44 |只看该作者

猫小请进,一个有关stringtokenizer的难题.

thank you very much ; i will try it.

论坛徽章:
0
9 [报告]
发表于 2004-12-14 02:21 |只看该作者

猫小请进,一个有关stringtokenizer的难题.

lilu_0608: 谢谢, 我看了你的程序, 都怪我开始没说清楚, 老师是要求我们使用stringtokenizer来进行字符的筛选, 我一开始也是给他一段程序,几乎都通过了,他都说不行,晕~~~
     我昨天对程序又进行了修改,没次进行下次测试都会导致新的问题,我觉的也许是方法中的token没处理好,请各位提供宝贵意见。

论坛徽章:
0
10 [报告]
发表于 2004-12-14 06:18 |只看该作者

猫小请进,一个有关stringtokenizer的难题.

是不是只要用到StringTokenizer完成就可以?
如可以,那我建议更改算法。
首先用StringTokenizer取表达式的值每一个值,用中缀式转后缀式的算法,然后求后缀式求值。
[code]
Infix2postfix pseudocode

        Algorithm: dequeue( )
                Input: None
                Output: Object

                if queue_isEmpty( ) then
throw a QueueEmptyException
                return Q[f]

        Algorithm: queue_size( )
                Input: None
                Output: Integer
               
                return (N-f+r) mod N

        Algorithm: push(o)
                Input: Object
                Output: None

                if stack_size( )=N then
                        throw a StackFullException
                t
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP