上周搭建了Android环境,这是我第一次尝试的Android项目。
*前期知识准备*
*Java集合-------> 栈与队列------->中缀表达式转后缀表达式(便于计算机处理表达式)&&计算后缀表达式
这里附上一个一个栈实现的括号配对。
【栈经常用于解析某种类型的文本串,这是一个检测用户输入的一行文本串中分隔符的程序,分隔符有大括号,中括号,小括号,每个左分隔符需要和右分隔符匹配,(也就是输入过程一种左分隔符的数量一定大于等于同类型右分隔符的数量),在字符串中后出现的分隔符要比先出现的分隔符更早完成匹配。/*分隔匹配符程序从栈中不断地读取字符,每读取一个字符如果发现它是一个左分隔符就将其压入栈中。当从输入中读取到一个右分隔符时,弹出栈顶的左分隔符,并且查看它是否与右分隔符匹配,如果不匹配,比如左{右),程序就要报错。非分隔符字符不插入栈,略过即可*/】
package abb;
import java.io.*;
public class stackd {
private int maxSize;
private char[] stackArray;
private int top;
public stackd(int s){
maxSize=s;
stackArray=new char[maxSize];
top=-1;
}
public void push(char j)
{
stackArray[++top]=j;
}
public char pop()
{
return stackArray[top--];
}
public char peek()
{
return stackArray[top];
}
public boolean isEmpty()
{
return(top==-1);
}
}
class BracketChecker(String in)
{
{input=in;}
public void check()
{
int stackSize=input.length();
Stack theStack=new StackX(stackSize);
stackd thestack=new stackd(stackaSize);
}
for(int j=0;j<input.length();j++)
{
char ch=input.charAt();
switch(ch)
{
case '{':
case '[':
case '(':
theStack.push(ch);
break;
case '}':
case ']':
case ')':
if(!theStack.isEmpty()){
char chx=theStack.pop();
if((ch='}'&&chx1!='{')||(ch='['&&chx2!=']')||ch='('&&ch3
!=')'){
System.out.println("Error:"+ch+"at"+j);
break;
default:break; }
}
if(theStack.isEmpty()){
System.out.println("Error!missing right delimiter");
}
}
}
class BracketApp
{
String input;
while(true)
{
System.out.print("enter string containing delimiters:");
}
System.out.flush();
input=getString();
if(input.equals(")")
break;
BracketChecker theChecker=new BracketChecker(input);
theChecker.check();
}
}
*逆波兰表达式------>计算时分两步走:先将中缀表达式 转为后缀表达式,再对后缀表达式进行计算*
[逆波兰表达式使用栈进行数字的存储。将中缀表达式转为后缀表达式:1.从左至右扫描一遍中缀表达式2.如果读取的是操作数,则判断该操作数的类型,并将该操作数存入操作数堆栈,若读取的是运算符,①运算符为左括号直接存入运算符堆栈②运算符为右括号,输出运算符堆栈中的操作符到操作数堆栈,直到遇到左括号为止③运算符为非括号运算符:若操作符堆栈栈顶元素为括号,则直接进入操作符堆栈;若比栈顶操作符的优先级高或者相等,直接进入操作符堆栈;若比运算符堆栈栈顶的运算符优先级低,则输出栈顶运算符到操作数堆栈,并将当前运算符压入运算符堆栈。4.当表达式读取完成后运算符堆栈中尚有运算符时,则依序取出运算符到操作数堆栈,直到运算符堆栈为空。]
这里同样的,附上一道逆波兰表达式的题目。
人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更“习惯于”后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式。
输入
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
每组都输出该组中缀式相应的后缀式,要求相邻的操作数操作符用空格隔开。
先不附代码了,哪天闲了,高兴了再慢慢做。
布局:我用的是线性布局。因为我就学到了线性布局,想用别的也没什么不可以的。
###第一版的计算器:
功能:实现了带括号的四则运算
问题:没有异常处理,
界面没有吸引力
未能实现负数的运算
UI部分代码:
package com.example.lenovo.calculator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import static com.example.lenovo.calculator.IndexInToDuffix.Houzhui;
public class MainActivity extends AppCompatActivity implements View.OnClickListener
{
private Button btn_0;
private Button btn_1;
private Button btn_2;
private Button btn_3;
private Button btn_4;
private Button btn_5;
private Button btn_6;
private Button btn_7;
private Button btn_8;
private Button btn_9;
private Button btn_point;
private Button btn_plus;
private Button btn_sub;
private Button btn_multi;
private Button btn_div;
private Button btn_left;
private Button btn_right;
private Button btn_ac; //清空
private Button btn_del;//删除
private Button btn_equals; //等号
private TextView et_showview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
public void initView() {
btn_0 = (Button) findViewById(R.id.btn_0);
btn_1 = (Button) findViewById(R.id.btn_1);
btn_2 = (Button) findViewById(R.id.btn_2);
btn_3 = (Button) findViewById(R.id.btn_3);
btn_4 = (Button) findViewById(R.id.btn_4);
btn_5 = (Button) findViewById(R.id.btn_5);
btn_6 = (Button) findViewById(R.id.b