算术表达式转四元式

public class Main extends JFrame{
    private JTextArea jTextArea=new JTextArea();
    private JButton jButton=new JButton("选择翻译的文件");
    private JPanel jPanel=new JPanel();

    public static void main(String[] args) {
        new Main();
    }

    public Main(){
        setLayout(new BorderLayout());
        jPanel.add(jButton);
        add(jPanel,BorderLayout.NORTH);
        add(new JScrollPane(jTextArea));

        setSize(500,400);
        setVisible(true);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        jButton.addActionListener(new ActionListener() {     //点击按钮,把文件内容翻译为四元式
            @Override
            public void actionPerformed(ActionEvent e) {
                try{
                    String stringFromFile=getStringFromFile();           //从文件获取算术表达式字符串
                    String standerdString=toStanderd(stringFromFile);    //把字符串转化为合适的格式,比如:23*(78-2)变为23 * ( 78 -2 )这样的形式
                    String getString_epilogue = getepilogue(standerdString); //中序算术表达式转为后序,比如a*(b-c)转为bc-a*
                    String getSiYuanShi_string=getSiYuanShi(getString_epilogue);
                    jTextArea.append(getSiYuanShi_string);
                }catch (Exception ex){

                }
            }
        });

    }

    public String getStringFromFile() throws Exception {     //从文件第一行获取算术表达式字符串
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.showOpenDialog(null);
        File file = fileChooser.getSelectedFile();       //选择文件
        Scanner read = new Scanner(file);
        String str = read.next();                       //读取文件第一行

        return str;
    }

    /*这是第一次想到的方法,逻辑上比较绕,感觉不太好理,就写了第二种方法*/
    /*public String toStanderd(String string){           //把字符串转化为合适的格式,比如:23*(78-2)变为23 * ( 78 -2 )这样的形式
        String standerdString="";
        int position=0;
        for(int i=0;i stack_operand=new Stack<>();         //操作数栈
        Stack stack_symbol=new Stack<>();          //符号栈

        for(int i=0;i stack=new Stack<>();
        int result_num=0;
        String result="T";
        for(int i=0;i

算术表达式

下面是执行结果

算术表达式转四元式_第1张图片

第一行是中序转后序需要的格式

第二行是转为后序的算术表达式


具体算法实现,代码里面有详细注释,这里说一下大概过程;

在文件中获取字符串方式就省略了,获取到要翻译的算术表达式字符串之后,转化为一种后面算法所需要的格式,比如5*(52-3)转化为的格式是:5 * ( 52 - 3 ),这一步转化在上面的代码里的方法是toStanderd(String string),转化之后获得的字符串如:第三张图里面第一行字符串,字符串仍然是中序,接下来转化为后序,用到方法getEgilogue(String string),转化为后序之后如:第三张图的第二行字符串。将后序转化为四元式用到的方法getSiYuanShi(String string)。

以上方法具体实现看上面代码,有详细注释。用到了java里面的Stack类以及压栈,出栈和返回栈顶元素的方法。

翻译的算术表达式和翻译结果是图一和图二。

如果看不懂算法注释,可以参考该链接里面的算法http://blog.csdn.net/u012507347/article/details/52245233

你可能感兴趣的:(编译原理)