日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android實現簡易計算器功能

瀏覽:20日期:2022-09-17 17:22:27

本項目為大家分享了Android實現計算器功能的具體代碼,供大家參考,具體內容如下

項目介紹

練手項目。能實現加減乘除及括號運算。

開發思路

界面布局

1.界面布局分三大塊:公式文本區、結果文本區、按鈕區。 2.通過點擊按鈕錄入數學公式,實時展示在公式文本區。 3.點擊等號,計算結果展示在結果文本區。 4.另外還有清空數據和刪除一個字符功能。

計算邏輯

1.將中綴表達式轉換為后綴表達式 2.計算后綴表達式得出結果

其他說明

棧數據結構簡單說明:

1.棧數據結構像彈夾一樣,先壓進去的子彈后打出來,后壓進去的子彈先打出來 2.入棧:將元素放進棧里,并改變棧頂指針 3.出棧:將元素從棧里拿出來,并改變棧頂指針 4.查看棧頂,取得棧頂元素,但不改變棧頂指針

中綴表達式轉后綴表達式簡單說明

1.如果是數字,直接放進后綴表達式里。

2.如果是左括號,入棧。

3.如果是右括號,依次出棧(放到后綴表達式里),直到遇到左括號。

4.運算符號:

1).空棧或棧頂是左括號,入棧 2).棧頂符號優先級比當前符號小,入棧 3).棧頂符號優先級大于等于當前符號,依次出棧(放到后綴表達式里),直到遇到不滿足條件的元素或棧被掏空。

5.最后如果棧還有符號,依次出棧(放到后綴表達式里)

后綴表達式計算簡單說明

1.如果是數字,入棧 2.如果是運算符,將棧頂的兩個數字彈出并計算(先出棧的數字放在運算符后面進行計算),再將計算結果入棧。

代碼

界面代碼

<?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:orientation='vertical' tools:context='.MainActivity'> <LinearLayoutandroid:layout_width='match_parent'android:layout_height='0dp'android:layout_weight='1'><TextView android: android:layout_width='match_parent' android:layout_height='match_parent' android:gravity='right' android:textSize='50dp' /> </LinearLayout> <Viewandroid:layout_width='wrap_content'android:layout_height='2dp'android:background='#000' /> <LinearLayoutandroid:layout_width='match_parent'android:layout_height='0dp'android:layout_weight='1'><TextView android: android:layout_width='match_parent' android:layout_height='match_parent' android:gravity='right' android:textSize='50dp' /> </LinearLayout> <Viewandroid:layout_width='wrap_content'android:layout_height='2dp'android:background='#000' /> <LinearLayoutandroid:layout_width='match_parent'android:layout_height='0dp'android:layout_weight='1'><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='(' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text=')' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='C' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='DEL' android:textSize='30sp' /> </LinearLayout> <LinearLayoutandroid:layout_width='match_parent'android:layout_height='0dp'android:layout_weight='1'><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='7' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='8' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='9' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='-' android:textSize='30sp' /> </LinearLayout> <LinearLayoutandroid:layout_width='match_parent'android:layout_height='0dp'android:layout_weight='1'><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='4' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='5' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='6' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='+' android:textSize='30sp' /> </LinearLayout> <LinearLayoutandroid:layout_width='match_parent'android:layout_height='0dp'android:layout_weight='1'><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='1' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='2' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='3' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='÷' android:textSize='30sp' /> </LinearLayout> <LinearLayoutandroid:layout_width='match_parent'android:layout_height='0dp'android:layout_weight='1'><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='0' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='.' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='=' android:textSize='30sp' /><Button android: android:layout_width='0dp' android:layout_height='match_parent' android:layout_weight='1' android:text='×' android:textSize='30sp' /> </LinearLayout></LinearLayout>

后臺邏輯

package com.example.calc;import android.os.Bundle;import android.widget.Button;import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;import com.example.calc.utils.Stack;import java.util.ArrayList;import java.util.Arrays;import java.util.HashMap;import java.util.List;import java.util.Map;public class MainActivity extends AppCompatActivity { static final String ADD_TEXT = '+'; static final String SUBSTRACTION_TEXT = '-'; static final String MULTIPLICATION_TEXT = '×'; static final String DIVISION_TEXT = '÷'; static final String LEFT_BRACKET_TEXT = '('; static final String RIGHT_BRACKET_TEXT = ')'; //符號集合 static final List<String> SYMBOLS = Arrays.asList(ADD_TEXT, SUBSTRACTION_TEXT, MULTIPLICATION_TEXT, DIVISION_TEXT, LEFT_BRACKET_TEXT, RIGHT_BRACKET_TEXT); //符號優先級 static final Map<String, Integer> SYMBOL_PRIORITY_LEVEL = new HashMap<String, Integer>(4) {{put(ADD_TEXT, 1);put(SUBSTRACTION_TEXT, 1);put(MULTIPLICATION_TEXT, 2);put(DIVISION_TEXT, 2); }}; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView(); } private void initView() {TextView expTextView = findViewById(R.id.the_expression);TextView resultTextView = findViewById(R.id.the_result);//數字與運算符按鈕int[] ids = {R.id.zero, R.id.one, R.id.two, R.id.three, R.id.four, R.id.five, R.id.six, R.id.seven, R.id.eight, R.id.nine, R.id.point, R.id.add, R.id.substraction, R.id.mulitipliction, R.id.division, R.id.left_bracket, R.id.right_bracket};for (int id : ids) { findViewById(id).setOnClickListener((v) -> {String newText = expTextView.getText().toString() + ((Button) v).getText().toString();expTextView.setText(newText); });}//刪除一個字符findViewById(R.id.delete).setOnClickListener((v) -> { CharSequence text = expTextView.getText(); if (text != null && text.length() > 0) {if (text.length() == 1) { expTextView.setText(null);} else { expTextView.setText(text.subSequence(0, text.length() - 1));} }});//清理findViewById(R.id.clear).setOnClickListener((v) -> { expTextView.setText(null); resultTextView.setText(null);});//等于findViewById(R.id.equal).setOnClickListener((v) -> { List<String> infix = getInfix(expTextView.getText().toString()); List<String> suffix = infixToSuffix(infix); Double result1 = getResult(suffix); String result = String.valueOf(result1); if (result.contains('.') && result.split('.')[1].replace('0', '').length() == 0) {result = result.split('.')[0]; } resultTextView.setText(result);}); } //字符串轉中綴表達式 private List<String> getInfix(String exp) {List<String> texts = new ArrayList<>();char[] chars = exp.toCharArray();StringBuilder sText = new StringBuilder();for (char c : chars) { String text = String.valueOf(c); if (SYMBOLS.contains(text)) {if (sText.length() > 0) { texts.add(sText.toString()); sText.delete(0, sText.length());}texts.add(text); } else {sText.append(text); }}if (sText.length() > 0) { texts.add(sText.toString()); sText.delete(0, sText.length());}return texts; } //中綴表達式轉后綴表達式 private List<String> infixToSuffix(List<String> infix) {List<String> sufText = new ArrayList<>();Stack<String> stack = new Stack<>(infix.size());for (String text : infix) { if (!SYMBOLS.contains(text)) {//數值,直接放到后綴表達式sufText.add(text); } else if (LEFT_BRACKET_TEXT.equals(text)) {//左括號,直接入棧stack.push(text); } else if (RIGHT_BRACKET_TEXT.equals(text)) {//右括號,依次取出棧頂元素放到后綴表達式,直到遇到左括號while (!stack.isEmpty()) { String pop = stack.pop(); if (!LEFT_BRACKET_TEXT.equals(pop)) {sufText.add(pop); } else {break; }} } else {//其他符號(+-*/)buildSuffix(text, sufText, stack); }}//取出剩余棧內數據放到后綴表達式while (!stack.isEmpty()) { sufText.add(stack.pop());}return sufText; } //后綴表達式求結果 private Double getResult(List<String> suffix) {Stack<Double> stack = new Stack<>(suffix.size());for (String text : suffix) { switch (text) {case SUBSTRACTION_TEXT: { Double pop1 = stack.pop(); Double pop2 = stack.pop(); stack.push(pop2 - pop1); break;}case ADD_TEXT: { Double pop1 = stack.pop(); Double pop2 = stack.pop(); stack.push(pop1 + pop2); break;}case DIVISION_TEXT: { Double pop1 = stack.pop(); Double pop2 = stack.pop(); stack.push(pop2 / pop1); break;}case MULTIPLICATION_TEXT: { Double pop1 = stack.pop(); Double pop2 = stack.pop(); stack.push(pop1 * pop2); break;}default: stack.push(Double.valueOf(text)); break; }}return stack.pop(); } private void buildSuffix(String symbol, List<String> suffix, Stack<String> stack) {if (stack.isEmpty()) { //是空棧符號直接入棧 stack.push(symbol);} else { //棧頂查看 String peek = stack.peek(); //棧頂是左括號符號或當前符號優先級大于棧頂符號直接入棧 if (LEFT_BRACKET_TEXT.equals(peek) || isGreaterThanLevel(symbol, peek)) {stack.push(symbol); } else {//棧頂不是左括號,依次取出比當前符號優先級小或優先級相同的符號放到后綴表達式while (!stack.isEmpty()) { if (isLessThanOrEquals(symbol, stack.peek())) {suffix.add(stack.pop()); } else {//遇到不符合條件的棧頂數據,直接退出break; }}//取完數據后,將當前符號入棧stack.push(symbol); }} } private boolean isGreaterThanLevel(String symbol, String peek) {Integer symbolLevel = SYMBOL_PRIORITY_LEVEL.get(symbol);Integer peekLevel = SYMBOL_PRIORITY_LEVEL.get(peek);return symbolLevel != null && peekLevel != null && symbolLevel > peekLevel; } private boolean isLessThanOrEquals(String symbol, String peek) {Integer symbolLevel = SYMBOL_PRIORITY_LEVEL.get(symbol);Integer peekLevel = SYMBOL_PRIORITY_LEVEL.get(peek);return symbolLevel != null && peekLevel != null && symbolLevel <= peekLevel; }}

棧數據結構

package com.example.calc.utils;public class Stack<T> { private int size; private Object[] elements; private int top = -1; public Stack(int size) {this.size = size;elements = new Object[size]; } //壓棧 public void push(T element) {if (top != size - 1) { elements[top + 1] = element; top++;} else { throw new RuntimeException('stack is full!');} } //彈棧 public T pop() {if (top > -1) { top--; return (T) elements[top + 1];} else { throw new RuntimeException('stack is null!');} } //查看棧頂 public T peek() {if (top > -1) { return (T) elements[top];} else { return null;} } public boolean isEmpty(){return top == -1; }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费成人在线影院| 日韩欧美自拍| 图片区亚洲欧美小说区| 日韩影院二区| 国产一区二区三区91| 国产成人精品免费视| 精品国产第一福利网站| 日韩免费视频| 99久久亚洲精品| 日韩一级网站| 中文字幕一区二区av| 日韩不卡一区二区三区| 国产精品片aa在线观看| 久久久精品区| 亚洲天堂资源| 国产高清一区| 美女网站久久| 国产亚洲高清在线观看| 久久精品亚洲一区二区| 国产一区二区三区四区五区传媒| 国产精品99久久精品| 婷婷激情一区| 亚洲在线免费| 日本欧美在线| 精品美女久久| 欧美.日韩.国产.一区.二区| 久久国产成人| 国产欧美日韩一区二区三区四区| 国产一区二区三区久久久久久久久| 蜜桃av.网站在线观看| 黄色日韩在线| 日韩不卡一区二区三区| 精品美女视频 | 久久久国产精品一区二区中文| 国内精品99| 日韩手机在线| 国产美女高潮在线观看| 日韩视频一区| 国产精品手机在线播放| 精品亚洲美女网站| 亚洲乱码视频| 久久精品国产网站| 亚洲一区二区免费看| 国产精品视频一区二区三区四蜜臂| 国产白浆在线免费观看| 亚洲免费网址| 国产一区二区视频在线看| 中文亚洲欧美| 麻豆一区二区三区| 99国产精品久久久久久久| 国产精品igao视频网网址不卡日韩| 精品国产乱码久久久久久1区2匹 | 国产一区二区三区天码| 欧美日韩国产综合网| 国产欧美在线观看免费| 黄色不卡一区| 久久99影视| 国产精品日韩| 精品视频一二| 蜜臀91精品一区二区三区| 国产一区二区精品久| 亚洲一区二区网站| 精品视频高潮| 亚洲香蕉视频| 亚洲日本网址| 国产丝袜一区| 亚洲一区免费| 桃色av一区二区| 91午夜精品| 欧美日韩免费观看一区=区三区| 国产精品1区在线| 久久福利毛片| 亚洲91久久| 国产麻豆精品| 亚洲自啪免费| 99视频精品全国免费| 欧美黄色精品| 亚洲精品极品| 狠狠色狠狠色综合日日tαg| 国产精选在线| 国产精品成人3p一区二区三区| 日韩在线a电影| 国产一区清纯| 国产va在线视频| 麻豆精品蜜桃视频网站| 日韩成人午夜精品| 亚洲一区免费| 欧美日韩在线网站| 精品国产欧美日韩一区二区三区| 亚洲精品国产精品粉嫩| 在线亚洲精品| 欧美日韩色图| 日韩高清中文字幕一区二区| 久久精品一区| 国产精品资源| 日韩毛片一区| 亚洲精品动态| 三级欧美在线一区| 在线亚洲一区| 在线 亚洲欧美在线综合一区| caoporn视频在线| 免费观看亚洲天堂| 国产精品黄网站| 日本aⅴ免费视频一区二区三区| 中文亚洲欧美| 一区在线免费观看| 欧美在线网站| 免费视频亚洲| 图片区亚洲欧美小说区| 久久伦理在线| 影视先锋久久| 久久要要av| 五月天久久久| 好吊一区二区三区| 亚洲激情另类| 亚洲美洲欧洲综合国产一区| 91成人精品视频| 激情久久五月| 久久国产亚洲| 91精品蜜臀一区二区三区在线| 日韩欧美一区二区三区在线视频 | 欧美中文字幕| 丝袜诱惑制服诱惑色一区在线观看| 99久久99久久精品国产片果冰| 久久精品91| 国产一区亚洲| 婷婷精品进入| 日本欧美在线看| 亚洲一区欧美激情| 丝袜脚交一区二区| 亚洲久久在线| 欧美日韩视频免费看| 91九色综合| 国产亚洲观看| 精品一区二区三区免费看| 久久精品国产在热久久| 成人台湾亚洲精品一区二区| 伊人久久国产| 国产综合激情| 久久国产精品久久w女人spa| 综合色就爱涩涩涩综合婷婷| 久久激情av| 精品久久久亚洲| 综合日韩av| 欧美日韩在线二区| 首页国产欧美日韩丝袜| 日韩毛片一区| 国产一区一一区高清不卡| 亚洲风情在线资源| 免费视频国产一区| 亚洲狼人精品一区二区三区| 欧美精品观看| 91亚洲国产成人久久精品| 欧美亚洲激情| 日本大胆欧美人术艺术动态| 国产伦精品一区二区三区千人斩| 精品一区二区三区四区五区| 欧美亚洲国产激情| 蜜桃久久精品一区二区| 欧美日韩一区二区三区不卡视频| 精品丝袜久久| 黄色欧美日韩| 国产精品一区二区三区av| 97se综合| 蜜桃视频在线观看一区二区| 麻豆精品av| 亚洲a一区二区三区| 亚洲精品乱码久久久久久蜜桃麻豆| 国产精品嫩模av在线| 日韩欧美三级| 亚洲一区av| 福利一区二区三区视频在线观看| 黄色av一区| 国产精品日本一区二区三区在线| 色偷偷偷在线视频播放| 在线精品视频一区| 国产黄大片在线观看| 亚洲一级大片| 日韩亚洲一区在线| 日韩在线观看一区二区三区| 91亚洲成人| 亚洲91网站| 日韩欧美午夜| 日韩av一区二区在线影视| 日韩在线免费| 日韩不卡免费视频| 99精品在线观看| 国产剧情一区二区在线观看| 欧美日韩尤物久久| 久久国产欧美日韩精品| 国产综合激情| 久久久国产精品网站| 丝袜诱惑制服诱惑色一区在线观看| 精品国产一区二区三区噜噜噜| 国产偷自视频区视频一区二区| 国产成人黄色| 日本久久一区| 欧美精选一区二区三区| 你懂的国产精品永久在线| 免费久久精品视频|