安卓利用栈和算术表达式优先级实现进阶版计算器

先po上具体的源代码

简单的xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.admin.compute.MainActivity"
    android:orientation="vertical">
    <TextView
        android:id="@+id/txt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="50sp"
        android:gravity="center_vertical|end"

        android:layout_marginTop="20dp"
        android:singleLine="true"
        android:ellipsize="start"
        />
    <TableLayout
        android:id="@+id/tablelayout01"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:shrinkColumns="1"
        android:stretchColumns="2"

        >
    <TableRow
        android:layout_marginTop="8dp">
    <Button
        android:id="@+id/add"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="+"
        android:textSize="30dip"
        android:layout_weight="1"/>
        <Button
            android:id="@+id/sub"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="-"
            android:textSize="30dip"
            android:layout_weight="1"/>

        <Button
            android:id="@+id/multiply"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="X"
            android:textSize="30dip"
            android:layout_weight="1"/>

        <Button
            android:id="@+id/divide"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="/"
            android:textSize="30dip"
            android:layout_weight="1"/>

    </TableRow>
        <TableRow
            android:layout_marginTop="8dp">
            <Button
                android:id="@+id/zero"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="0"
                android:textSize="30dip"
                android:layout_weight="1"/>
            <Button
                android:id="@+id/one"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="1"
                android:textSize="30dip"
                android:layout_weight="1"/>

            <Button
                android:id="@+id/two"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="2"
                android:textSize="30dip"
                android:layout_weight="1"/>

            <Button
                android:id="@+id/three"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="3"
                android:textSize="30dip"
                android:layout_weight="1"/>

        </TableRow>
        <TableRow
            android:layout_marginTop="8dp">
            <Button
                android:id="@+id/four"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="4"
                android:textSize="30dip"
                android:layout_weight="1"/>
            <Button
                android:id="@+id/five"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="5"
                android:textSize="30dip"
                android:layout_weight="1"/>

            <Button
                android:id="@+id/six"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="6"
                android:textSize="30dip"
                android:layout_weight="1"/>

            <Button
                android:id="@+id/seven"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="7"
                android:textSize="30dip"
                android:layout_weight="1"/>

        </TableRow>
        <TableRow
            android:layout_marginTop="8dp">
            <Button
                android:id="@+id/eight"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="8"
                android:textSize="30dip"
                android:layout_weight="1"/>
            <Button
                android:id="@+id/nine"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="9"
                android:textSize="30dip"
                android:layout_weight="1"/>

            <Button
                android:id="@+id/point"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="."
                android:textSize="30dip"
                android:layout_weight="1"/>

            <Button
                android:id="@+id/backspace"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="《—"
                android:textSize="30dip"
                android:layout_weight="1"/>

        </TableRow>
        <TableRow>

            <Button
                android:id="@+id/result"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text="="
                android:textSize="30dip"
                android:layout_weight="1"/>
            </TableRow>
    </TableLayout>

</LinearLayout>

接着是具体的java实现

package com.example.admin.compute;
import java.util.Stack;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import android.widget.TextView;

public class MainActivity extends Activity {

    private Button add,sub,multiply,divide,zero,one,two,three,four,five,six,seven,eight,nine,point,result,backspace;
    private TextView txt;
    private String operation="";
    int q=0;
    String a[];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setupViewComponent();
    }

    private void setupViewComponent() {
        add= (Button) findViewById(R.id.add);
        sub= (Button)findViewById(R.id.sub);
        multiply= (Button)findViewById(R.id.multiply);
        divide= (Button)findViewById(R.id.divide);
        zero= (Button)findViewById(R.id.zero);
        one= (Button)findViewById(R.id.one);
        two= (Button)findViewById(R.id.two);
        three= (Button)findViewById(R.id.three);
        four= (Button)findViewById(R.id.four);
        five= (Button)findViewById(R.id.five);
        six= (Button)findViewById(R.id.six);
        seven= (Button)findViewById(R.id.seven);
        eight= (Button)findViewById(R.id.eight);
        nine= (Button)findViewById(R.id.nine);
        point= (Button)findViewById(R.id.point);
        result= (Button)findViewById(R.id.result);
        backspace=(Button)findViewById(R.id.backspace) ;
        txt= (TextView) findViewById(R.id.txt);
        add.setOnClickListener(addOnClick);
        sub.setOnClickListener(subOnClick);
        multiply.setOnClickListener(multiplyOnClick);
        divide.setOnClickListener(divideOnClick);
        one.setOnClickListener(oneOnClick);
        two.setOnClickListener(twoOnClick);
        three.setOnClickListener(threeOnClick);
        four.setOnClickListener(fourOnClick);
        five.setOnClickListener(fiveOnClick);
        six.setOnClickListener(sixOnClick);
        seven.setOnClickListener(sevenOnClick);
        eight.setOnClickListener(eightOnClick);
        nine.setOnClickListener(nineOnClick);
        zero.setOnClickListener(zeroOnClick);
        point.setOnClickListener(pointOnClick);
        result.setOnClickListener(resultOnClick);
        backspace.setOnClickListener(backspaceOnClick);
    }
    private Button.OnClickListener backspaceOnClick=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            if(operation.length()>1)
            {operation=operation.substring(0,operation.length()-1);
            txt.setText(operation);}
            else{
                operation="0";
                txt.setText(operation);
            }
        }
    };
    private Button.OnClickListener addOnClick=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            operation+="+";
            txt.setText(operation);
        }
    };
    private Button.OnClickListener subOnClick=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            operation+="-";
            txt.setText(operation);
        }
    };
    private Button.OnClickListener multiplyOnClick=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            operation+="*";
            txt.setText(operation);
        }
    };
    private Button.OnClickListener divideOnClick=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            operation+="/";
            txt.setText(operation);
        }
    };
    private Button.OnClickListener zeroOnClick=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            operation+="0";
            txt.setText(operation);
        }
    };
    private Button.OnClickListener oneOnClick=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            operation+="1";
            txt.setText(operation);
        }
    };
    private Button.OnClickListener twoOnClick=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            operation+="2";
            txt.setText(operation);
        }
    };
    private Button.OnClickListener threeOnClick=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            operation+="3";
            txt.setText(operation);
        }
    };
    private Button.OnClickListener fourOnClick=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            operation+="4";
            txt.setText(operation);
        }
    };
    private Button.OnClickListener fiveOnClick=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            operation+="5";
            txt.setText(operation);
        }
    };
    private Button.OnClickListener sixOnClick=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            operation+="6";
            txt.setText(operation);
        }
    };
    private Button.OnClickListener sevenOnClick=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            operation+="7";
            txt.setText(operation);
        }
    };
    private Button.OnClickListener eightOnClick=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            operation+="8";
            txt.setText(operation);
        }
    };
    private Button.OnClickListener nineOnClick=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            operation+="9";
            txt.setText(operation);
        }
    };
    private Button.OnClickListener pointOnClick=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            operation+=".";
            txt.setText(operation);

        }
    };
    private Button.OnClickListener resultOnClick=new Button.OnClickListener(){

        @Override
        public void onClick(View v) {
            operation+="#";
            if (operation.charAt(0)==‘-‘){
                operation="0"+operation;
            }

            java.util.Stack<String> OPTR=new java.util.Stack<String>();
            java.util.Stack<String> OPND=new java.util.Stack<String>();
            OPTR.push("#");
            String buf="";
            String theta,a,b;
            char buffer;
            int i=1;

            while(operation.charAt(i-1)!=‘#‘||OPTR.peek()!="#"){
                if (operation.charAt(i-1)==‘+‘||operation.charAt(i-1)==‘-‘||operation.charAt(i-1)==‘*‘||operation.charAt(i-1)==‘/‘||operation.charAt(i-1)==‘#‘){

                    if (buf!="")
                    {OPND.push(buf);}

                    buffer=(OPTR.peek()).charAt(0);
                    if(Precede(buffer,operation.charAt(i-1))==‘>‘)
                    {
                        theta=OPTR.pop();
                        b=OPND.pop();
                        a=OPND.pop();
                        OPND.push(Operate(a,theta,b));

                    }
                   else {

                       OPTR.push(String.valueOf(operation.charAt(i - 1)));
                        i=i+1;
                    }

                    buf="";
                }
                else{
                    buf+=operation.charAt(i-1);
                    i=i+1;
                }
            }

            operation=OPND.peek();
            txt.setText(operation);

        }

        private String Operate(String a, String theta, String b) {
            char cao=theta.charAt(0);
            if(cao==‘+‘)
                return String.valueOf(Float.parseFloat(a)+Float.parseFloat(b));
            if(cao==‘-‘)
                return String.valueOf(Float.parseFloat(a)-Float.parseFloat(b));
            if(cao==‘*‘)
                return String.valueOf(Float.parseFloat(a)*Float.parseFloat(b));
            else
                return String.valueOf(Float.parseFloat(a)/Float.parseFloat(b));

        }

        private char Precede(char peek, char c) {
            if (peek==‘+‘||peek==‘-‘){
                if(c==‘+‘||c==‘-‘||c==‘#‘)
                    return ‘>‘;
            }
            if (peek==‘*‘||peek==‘/‘){
                return ‘>‘;
            }
            if (c==‘#‘){
                return ‘>‘;
            }
            else
                return ‘<‘;
        }

    };

}

具体实现方式和原理参考《数据结构》中对于栈的简单应用,博主也是为了考研,再加上安卓老师要求制作计算器,便顺带这着小小复习了一下栈;

不得不说高级语言就是蛮好用的,栈可以直接使用,方法也都是现成的,方便。

具体实现过程就是按下每个运算符或者数字按钮,就将字符串operation后边接上新的字符,对于整体的处理则放在等号的监听器中;其他的大体架构切记要和书上一致啊,这点博主算是吃了大亏,以为耍了个小聪明便用了别的处理方式,结果最后又推到了全重做了,好气啊。。。。

这里还有编程中遇到的几个问题没有研究透,比如说字符char和String之间的转换,总感觉会产生乱七八糟的丢失。还有这里边的switch,TM的总是整不出正确的结果,真是奇怪我日。。。。

就这样。。

时间: 2024-10-09 23:38:00

安卓利用栈和算术表达式优先级实现进阶版计算器的相关文章

使用栈完成算术表达式的计算

前言:本篇文章讲解如何利用栈,完成一个简单的算术表达式的计算过程.为了简单起见,首先假设操作数是整数,而运算符为四种类型:+.-.*./ 基本思路:为了完成算术表达式的计算,用到了两个栈,一个用于存放操作数,另一个用于存放操作符. 假设:程序中定义了两个栈:operandStack(用来存放操作数).operatorStack(用于存放操作符). 在处理操作数和操作符之前,首先将它们压入栈中.当要处理一个操作符时,从operatorStack中将它弹出,然后将它应用在来自operandStack

利用栈计算算数表达式的值

先将中缀表达式利用栈转换为后缀表达式,然后再利用栈由后缀表达式计算算数表达式的值,具体代码如下: #include <iostream> using namespace std; #include <string> #include <vector> #include <stack> enum Type { OP_NUM, OP_SYMBOL, }; enum Operat { ADD, SUB, MUL, DIV, }; struct Cell { Typ

c++用栈实现算术表达式的计算

用栈将算术表达式转换成后缀表达式的形式大家应该不陌生了,但是我在实现计算的时候却发现坑还是不少. 题目描述: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 输入描述: 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔.没有非法表达式.当一行中只有0时输入结束,相应的结果不要输出. 输出描述: 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位. 示例1 输入 1 + 2 4 + 2 * 5 - 7 /

双栈计算算术表达式

1.介绍 算术表达式的计算,是比较常见的问题,但这个问题的背后隐藏着栈的思想. 这里就介绍使用两个栈来计算表达式的方法. 2. 算法 2.1 定义: a) 建立两个栈: 一个是数据栈dataStak,用于存放数据: 一个是符号栈operatorStack,用于存放运算符: b) 建立运算符号之间的优先级表,用于比较两个符号之间的优先级: 优先级定义为三种运算结果:>(表示高于),<(表示低于),=(表示相等): 并且对于"("与")",认为两者的优先级相

运用栈把算术表达式+,-,*,/,%(中缀表达式)转换成后缀表达式并且计算出值

原理: 1.首先判断是数值还是符号,如果是数值放进字符数组以#表示结束, 2.如果是符号,放进栈, 3.每个符号之间要比较优先级,如果栈顶符号优先级低,符号进栈,如果相等(即“(” “)”)出栈,栈顶符号优先级高,栈顶元素出栈进入字符数组,得到后缀表达式 4.计算后缀表达式,判断是数字还是符号.直到遇到符号,将前面的数字计算后放进栈,一直重复,知道“\0” 代码(局限用整数,因为有模运算,若要任何类型的代码,我的blog有) 1 #include <stdio.h> 2 #include &l

利用栈求逻辑运算表达式的真值

今天浙江理工校赛的D题. 比赛结束后在网上看了文章才做出来的. Problem D: 逻辑运算 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 248  Solved: 36 Description 还记得大学里学过的模电么,今天就让我们将与或非变成一道题吧. 给你一个与或非的表达式,求出这个表达式的值,表达式总共有八种字符. 三种逻辑运算符按照优先级排列如下. '!':表示取反. '&':逻辑与. '|':逻辑或. 两个字符'T','F'分别表示

利用栈将中缀表达式转为后缀表达式

#include<iostream>#include<stdio.h>using namespace std;#include<stack>const int SM = 40;int Precedence(char op){    //返回运算符op所对应的优先级数值    switch (op){    case '+':    case '-':return 1;//定义加减运算的优先级为1    case '*':    case '/':return 2;//定

Go语言用栈实现算术表达式

将中序表达式转成后序表达式,再通过后序表达式计算出值. package main //表达式 //author:Xiong Chuan Liang //date:2015-2-2 import ( "fmt" "github.com/xcltapestry/xclpkg/algorithm" "strconv" "errors" ) func main(){ // 中序表达式 后序表达式 // a+b = ab+ // (a+

将中缀表达式转换为后缀表达式,然后利用栈对表达式求值。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js.js"></script> </head> <body> 输入中缀表达式空格分隔 例如 2 + 3 <input type=