• 一个使用AndroidStudio实现的简单逆波兰表达式计算求值的App,算是安卓App入门练手项目吧


    可选择的谷歌安卓开发语言有多种,这里选择的是Java

     

    如何安装AndroidStudio,请看:小白使用Android Studio开发安卓app_来自喵星的博客-CSDN博客_android studio 开发安卓Android Studio入门到放弃经过一系列的折磨,终于创建出来Android项目了下面说说我从零创建app程序的Android Studio配置安装SDK版本SDK Tools的Android SDK Build-Tools 30-rC2版本,有什么用什么,要和那个对应同样的也是版本对应...https://blog.csdn.net/qq_27577113/article/details/105371477如何安装安卓开发环境最主要的就是解决环境兼容性问题,我下载的环境是在安装扩展硬盘之后把Android相关环境全部下载了,下载了30GB左右环境文件,每一个安卓版本大概有1GB~2GB相关配置,如果只用安卓某几个版本,倒是不用下这么多,因为安卓版本实在太多了(2022年5月12日,谷歌举办I/O 2022开发者大会,并正式发布Android 13。),每个版本基本都有很大改动,特别是低版本,一个小版本不兼容最终都可能导致整个项目无法正常运行,这一点特别要注意

    点击项目结构为Android,整个项目结构如下

     

    文件介绍:

    MainActivity:app创建时执行的一个主要类,里面会对页面的一些按钮或文本进行初始化,这里的初始化有两种方式,一个是通过findViewById选择页面中的某个组件进行初始化,有点类似JavaScript中的document.getElementById这个方法,只不过这个的id都是放到R.id这个map中的,另一个就是创建页面组件时,通过android:onClick属性手动添加触发事件

    activity_main.xml:页面布局主要文件,这里我弄了一个简单的类似于手机上的计算器的布局,只不过这个计算器能力有限,只能进行逆波兰表达式的计算,并且还是单数字的哈哈哈

    波兰表达式介绍:波兰表示法_百度百科

    MainActivity代码如下:

    1. package com.example.mycalculate;
    2. import androidx.appcompat.app.AppCompatActivity;
    3. import android.content.DialogInterface;
    4. import android.os.Bundle;
    5. import android.util.Log;
    6. import android.view.View;
    7. import android.widget.Button;
    8. import android.widget.TextView;
    9. import java.util.ArrayList;
    10. import java.util.List;
    11. import java.util.Stack;
    12. public class MainActivity extends AppCompatActivity {
    13. @Override
    14. protected void onCreate(Bundle savedInstanceState) {
    15. super.onCreate(savedInstanceState);
    16. setContentView(R.layout.activity_main);
    17. findViewById(R.id.btnClear).setOnClickListener(new View.OnClickListener() {
    18. @Override
    19. public void onClick(View view) {
    20. ((TextView) findViewById(R.id.txtMsg)).setText("");
    21. }
    22. });
    23. findViewById(R.id.btnDelete).setOnClickListener(new View.OnClickListener() {
    24. @Override
    25. public void onClick(View view) {
    26. String text = ((TextView) findViewById(R.id.txtMsg)).getText().toString();
    27. if (text.length() > 0) {
    28. ((TextView) findViewById(R.id.txtMsg)).setText(text.substring(0, text.length() - 1));
    29. }
    30. }
    31. });
    32. //计算结果
    33. findViewById(R.id.btnCalc).setOnClickListener(new View.OnClickListener() {
    34. @Override
    35. public void onClick(View view) {
    36. //逆波兰表达式求值
    37. String expStr = ((TextView) findViewById(R.id.txtMsg)).getText().toString();
    38. String[] exp = new String[expStr.length()];
    39. for (int i = 0; i < expStr.length(); i++) {
    40. exp[i] = expStr.charAt(i) + "";
    41. }
    42. int result = evalRPN(exp);
    43. TextView txtMsg = findViewById(R.id.txtMsg);
    44. txtMsg.setText(txtMsg.getText().toString().concat("=" + result + ""));
    45. }
    46. });
    47. }
    48. public void myClick(View view) {
    49. Button btn = (Button) view;
    50. TextView txtMsg = findViewById(R.id.txtMsg);
    51. CharSequence btn0Txt = btn.getText();
    52. txtMsg.setText(txtMsg.getText().toString().concat(btn0Txt.toString()));
    53. }
    54. public void execCalc(View view) {
    55. Button btn = (Button) view;
    56. TextView txtMsg = findViewById(R.id.txtMsg);
    57. CharSequence btn0Txt = btn.getText();
    58. txtMsg.setText(txtMsg.getText().toString().concat(btn0Txt.toString()));
    59. }
    60. public int evalRPN(String[] tokens) {
    61. Stack stack = new Stack();
    62. for (String s : tokens) {
    63. if (isNumber(s)) {
    64. stack.push(s);
    65. } else {
    66. Integer num1 = Integer.parseInt(stack.pop() + "");
    67. Integer num2 = Integer.parseInt(stack.pop() + "");
    68. Integer t = mathMath(num2, num1, s);
    69. stack.push(t);
    70. }
    71. }
    72. return Integer.parseInt(stack.pop() + "");
    73. }
    74. //执行数学运算
    75. public static Integer mathMath(Integer num1, Integer num2, String operator) {
    76. if ("+".equals(operator))
    77. return Math.addExact(num1, num2);
    78. if ("-".equals(operator))
    79. return Math.subtractExact(num1, num2);
    80. if ("*".equals(operator))
    81. return Math.multiplyExact(num1, num2);
    82. if ("/".equals(operator))
    83. return num1 / num2;
    84. return 0;
    85. }
    86. //判断是否是数字,如果是数字则返回true,否则返回false
    87. public static boolean isNumber(String str) {
    88. if (str == null || str.length() == 0)
    89. return false;
    90. if (str.length() == 1) {
    91. if (!(str.charAt(0) >= '0' && str.charAt(0) <= '9')) {
    92. return false;
    93. }
    94. }
    95. for (int i = 0; i < str.length(); i++) {
    96. if (str.charAt(0) == '+' || str.charAt(0) == '-') {
    97. continue;
    98. }
    99. if (!(str.charAt(i) >= '0' && str.charAt(i) <= '9')) {
    100. return false;
    101. }
    102. }
    103. return true;
    104. }
    105. //计算两个符号的优先级 返回小等于零的数表示后面优先级高 否则前面优先级高
    106. public static int maxOperator(String operator1, String operator2) {
    107. int weight1 = getPriority(operator1);//符号一权重
    108. int weight2 = getPriority(operator2);//符号二权重
    109. return weight1 - weight2;
    110. }
    111. //获取符号权重
    112. public static int getPriority(String operator) {
    113. if ("+".equals(operator) || "-".equals(operator))
    114. return 1;
    115. else if ("*".equals(operator) || "/".equals(operator) || "%".equals(operator))
    116. return 2;
    117. else
    118. return 0;
    119. }
    120. }

    activity_main.xml页面布局文件代码

    1. "1.0" encoding="utf-8"?>
    2. "http://schemas.android.com/apk/res/android"
    3. xmlns:app="http://schemas.android.com/apk/res-auto"
    4. xmlns:tools="http://schemas.android.com/tools"
    5. android:layout_width="match_parent"
    6. android:layout_height="match_parent"
    7. tools:context=".MainActivity">
    8. android:id="@+id/btn0"
    9. android:layout_width="wrap_content"
    10. android:layout_height="wrap_content"
    11. android:onClick="myClick"
    12. android:text="0"
    13. app:layout_constraintBottom_toBottomOf="parent"
    14. app:layout_constraintHorizontal_bias="0.321"
    15. app:layout_constraintLeft_toLeftOf="parent"
    16. app:layout_constraintRight_toRightOf="parent"
    17. app:layout_constraintTop_toTopOf="parent"
    18. app:layout_constraintVertical_bias="0.339" />
    19. android:id="@+id/btn1"
    20. android:layout_width="wrap_content"
    21. android:layout_height="wrap_content"
    22. android:onClick="myClick"
    23. android:text="1"
    24. app:layout_constraintBottom_toBottomOf="parent"
    25. app:layout_constraintHorizontal_bias="0.027"
    26. app:layout_constraintLeft_toLeftOf="parent"
    27. app:layout_constraintRight_toRightOf="parent"
    28. app:layout_constraintTop_toTopOf="parent"
    29. app:layout_constraintVertical_bias="0.128" />
    30. android:id="@+id/btn2"
    31. android:layout_width="wrap_content"
    32. android:layout_height="wrap_content"
    33. android:onClick="myClick"
    34. android:text="2"
    35. app:layout_constraintBottom_toBottomOf="parent"
    36. app:layout_constraintHorizontal_bias="0.321"
    37. app:layout_constraintLeft_toLeftOf="parent"
    38. app:layout_constraintRight_toRightOf="parent"
    39. app:layout_constraintTop_toTopOf="parent"
    40. app:layout_constraintVertical_bias="0.128" />
    41. android:id="@+id/btn3"
    42. android:layout_width="wrap_content"
    43. android:layout_height="wrap_content"
    44. android:onClick="myClick"
    45. android:text="3"
    46. app:layout_constraintBottom_toBottomOf="parent"
    47. app:layout_constraintHorizontal_bias="0.616"
    48. app:layout_constraintLeft_toLeftOf="parent"
    49. app:layout_constraintRight_toRightOf="parent"
    50. app:layout_constraintTop_toTopOf="parent"
    51. app:layout_constraintVertical_bias="0.128" />
    52. android:id="@+id/btn4"
    53. android:layout_width="wrap_content"
    54. android:layout_height="wrap_content"
    55. android:onClick="myClick"
    56. android:text="4"
    57. app:layout_constraintBottom_toBottomOf="parent"
    58. app:layout_constraintHorizontal_bias="0.027"
    59. app:layout_constraintLeft_toLeftOf="parent"
    60. app:layout_constraintRight_toRightOf="parent"
    61. app:layout_constraintTop_toTopOf="parent"
    62. app:layout_constraintVertical_bias="0.199" />
    63. android:id="@+id/btn5"
    64. android:layout_width="wrap_content"
    65. android:layout_height="wrap_content"
    66. android:text="5"
    67. android:onClick="myClick"
    68. app:layout_constraintBottom_toBottomOf="parent"
    69. app:layout_constraintHorizontal_bias="0.321"
    70. app:layout_constraintLeft_toLeftOf="parent"
    71. app:layout_constraintRight_toRightOf="parent"
    72. app:layout_constraintTop_toTopOf="parent"
    73. app:layout_constraintVertical_bias="0.199" />
    74. android:id="@+id/btn6"
    75. android:layout_width="wrap_content"
    76. android:layout_height="wrap_content"
    77. android:text="6"
    78. android:onClick="myClick"
    79. app:layout_constraintBottom_toBottomOf="parent"
    80. app:layout_constraintHorizontal_bias="0.616"
    81. app:layout_constraintLeft_toLeftOf="parent"
    82. app:layout_constraintRight_toRightOf="parent"
    83. app:layout_constraintTop_toTopOf="parent"
    84. app:layout_constraintVertical_bias="0.199" />
    85. android:id="@+id/btn7"
    86. android:layout_width="wrap_content"
    87. android:layout_height="wrap_content"
    88. android:onClick="myClick"
    89. android:text="7"
    90. app:layout_constraintBottom_toBottomOf="parent"
    91. app:layout_constraintHorizontal_bias="0.027"
    92. app:layout_constraintLeft_toLeftOf="parent"
    93. app:layout_constraintRight_toRightOf="parent"
    94. app:layout_constraintTop_toTopOf="parent"
    95. app:layout_constraintVertical_bias="0.269" />
    96. android:id="@+id/btn8"
    97. android:layout_width="wrap_content"
    98. android:layout_height="wrap_content"
    99. android:onClick="myClick"
    100. android:text="8"
    101. app:layout_constraintBottom_toBottomOf="parent"
    102. app:layout_constraintHorizontal_bias="0.321"
    103. app:layout_constraintLeft_toLeftOf="parent"
    104. app:layout_constraintRight_toRightOf="parent"
    105. app:layout_constraintTop_toTopOf="parent"
    106. app:layout_constraintVertical_bias="0.269" />
    107. android:id="@+id/btn9"
    108. android:layout_width="wrap_content"
    109. android:layout_height="wrap_content"
    110. android:text="9"
    111. android:onClick="myClick"
    112. app:layout_constraintBottom_toBottomOf="parent"
    113. app:layout_constraintHorizontal_bias="0.616"
    114. app:layout_constraintLeft_toLeftOf="parent"
    115. app:layout_constraintRight_toRightOf="parent"
    116. app:layout_constraintTop_toTopOf="parent"
    117. app:layout_constraintVertical_bias="0.269" />
    118. android:id="@+id/btnDot"
    119. android:layout_width="wrap_content"
    120. android:layout_height="wrap_content"
    121. android:text="."
    122. app:layout_constraintBottom_toBottomOf="parent"
    123. app:layout_constraintHorizontal_bias="0.616"
    124. app:layout_constraintLeft_toLeftOf="parent"
    125. app:layout_constraintRight_toRightOf="parent"
    126. app:layout_constraintTop_toTopOf="parent"
    127. app:layout_constraintVertical_bias="0.339" />
    128. android:id="@+id/btnDivide"
    129. android:layout_width="wrap_content"
    130. android:layout_height="wrap_content"
    131. android:text="/"
    132. app:layout_constraintBottom_toBottomOf="parent"
    133. app:layout_constraintHorizontal_bias="0.934"
    134. app:layout_constraintLeft_toLeftOf="parent"
    135. app:layout_constraintRight_toRightOf="parent"
    136. app:layout_constraintTop_toTopOf="parent"
    137. app:layout_constraintVertical_bias="0.058" />
    138. android:id="@+id/btnMultiply"
    139. android:layout_width="wrap_content"
    140. android:layout_height="wrap_content"
    141. android:onClick="execCalc"
    142. android:text="*"
    143. app:layout_constraintBottom_toBottomOf="parent"
    144. app:layout_constraintHorizontal_bias="0.934"
    145. app:layout_constraintLeft_toLeftOf="parent"
    146. app:layout_constraintRight_toRightOf="parent"
    147. app:layout_constraintTop_toTopOf="parent"
    148. app:layout_constraintVertical_bias="0.128" />
    149. android:id="@+id/button13"
    150. android:layout_width="wrap_content"
    151. android:layout_height="wrap_content"
    152. android:text="-"
    153. android:onClick="execCalc"
    154. app:layout_constraintBottom_toBottomOf="parent"
    155. app:layout_constraintHorizontal_bias="0.934"
    156. app:layout_constraintLeft_toLeftOf="parent"
    157. app:layout_constraintRight_toRightOf="parent"
    158. app:layout_constraintTop_toTopOf="parent"
    159. app:layout_constraintVertical_bias="0.199" />
    160. android:id="@+id/button14"
    161. android:layout_width="wrap_content"
    162. android:layout_height="wrap_content"
    163. android:text="+"
    164. android:onClick="execCalc"
    165. app:layout_constraintBottom_toBottomOf="parent"
    166. app:layout_constraintHorizontal_bias="0.934"
    167. app:layout_constraintLeft_toLeftOf="parent"
    168. app:layout_constraintRight_toRightOf="parent"
    169. app:layout_constraintTop_toTopOf="parent"
    170. app:layout_constraintVertical_bias="0.269" />
    171. android:id="@+id/btnMo"
    172. android:layout_width="wrap_content"
    173. android:layout_height="wrap_content"
    174. android:text="%"
    175. android:onClick="execCalc"
    176. app:layout_constraintBottom_toBottomOf="parent"
    177. app:layout_constraintHorizontal_bias="0.616"
    178. app:layout_constraintLeft_toLeftOf="parent"
    179. app:layout_constraintRight_toRightOf="parent"
    180. app:layout_constraintTop_toTopOf="parent"
    181. app:layout_constraintVertical_bias="0.058" />
    182. android:id="@+id/btnDelete"
    183. android:layout_width="wrap_content"
    184. android:layout_height="wrap_content"
    185. android:text="删除"
    186. app:layout_constraintBottom_toBottomOf="parent"
    187. app:layout_constraintHorizontal_bias="0.321"
    188. app:layout_constraintLeft_toLeftOf="parent"
    189. app:layout_constraintRight_toRightOf="parent"
    190. app:layout_constraintTop_toTopOf="parent"
    191. app:layout_constraintVertical_bias="0.058" />
    192. android:id="@+id/btnClear"
    193. android:layout_width="wrap_content"
    194. android:layout_height="wrap_content"
    195. android:text="C"
    196. app:layout_constraintBottom_toBottomOf="parent"
    197. app:layout_constraintHorizontal_bias="0.027"
    198. app:layout_constraintLeft_toLeftOf="parent"
    199. app:layout_constraintRight_toRightOf="parent"
    200. app:layout_constraintTop_toTopOf="parent"
    201. app:layout_constraintVertical_bias="0.058" />
    202. android:id="@+id/btnBlank"
    203. android:layout_width="wrap_content"
    204. android:layout_height="wrap_content"
    205. android:text=" "
    206. app:layout_constraintBottom_toBottomOf="parent"
    207. app:layout_constraintHorizontal_bias="0.027"
    208. app:layout_constraintLeft_toLeftOf="parent"
    209. app:layout_constraintRight_toRightOf="parent"
    210. app:layout_constraintTop_toTopOf="parent"
    211. app:layout_constraintVertical_bias="0.339" />
    212. android:id="@+id/btnCalc"
    213. android:layout_width="wrap_content"
    214. android:layout_height="wrap_content"
    215. android:text="="
    216. app:layout_constraintBottom_toBottomOf="parent"
    217. app:layout_constraintHorizontal_bias="0.934"
    218. app:layout_constraintLeft_toLeftOf="parent"
    219. app:layout_constraintRight_toRightOf="parent"
    220. app:layout_constraintTop_toTopOf="parent"
    221. app:layout_constraintVertical_bias="0.339" />
    222. android:id="@+id/txtMsg"
    223. android:layout_width="381dp"
    224. android:layout_height="26dp"
    225. android:text=""
    226. app:layout_constraintBottom_toBottomOf="parent"
    227. app:layout_constraintHorizontal_bias="0.303"
    228. app:layout_constraintLeft_toLeftOf="parent"
    229. app:layout_constraintRight_toRightOf="parent"
    230. app:layout_constraintTop_toTopOf="parent"
    231. app:layout_constraintVertical_bias="0.422" />
    232. android:id="@+id/textView2"
    233. android:layout_width="202dp"
    234. android:layout_height="40dp"
    235. android:text="逆波兰表达式求值"
    236. app:layout_constraintBottom_toBottomOf="parent"
    237. app:layout_constraintHorizontal_bias="0.045"
    238. app:layout_constraintLeft_toLeftOf="parent"
    239. app:layout_constraintRight_toRightOf="parent"
    240. app:layout_constraintTop_toTopOf="parent"
    241. app:layout_constraintVertical_bias="0.536" />

    通过配置的虚拟机环境,点击运行进行测试,点击数字99*然后点击等于计算一下结果,可以看到正常进行9*9的计算了

    有时候安卓模拟器启动后不能正常显示,这里是解决办法:

    关于Android Studio的emulator启动后无法正常显示那件事_来自喵星的博客-CSDN博客

  • 相关阅读:
    平平淡淡、坚守初心、砥砺前行
    【SwiftUI项目】0011、SwiftUI项目-费用跟踪-记账App项目-第3/3部分 -日期指定选定-新增费用页面
    【ACWing】3627. 最大差值
    8月份补丁更新:微软修补了121个安全漏洞
    【广州华锐互动】利用AR远程指导系统进行机械故障排查,实现远程虚拟信息互动
    【UML】类图Class Diagram
    nlp模型训练接口
    Desthiobiotin-PEG4-Azide_脱硫生物素-叠氮化物 100mg
    Leetcode 40. 组合总和 II
    电压提前/滞后电路 —— 电赛综测备赛
  • 原文地址:https://blog.csdn.net/qq_27577113/article/details/127757014