类中存在好多System.out,是调试作用的,可能看起来会很多余,自己可以删掉,代码看起来就干净多了。java中本身也有内置好了的堆栈,也可以看下
package com.example.hanhan;
import java.util.ArrayList;
public class Stack {
String[] code=new String[100]; //数组用来实现栈
int top=0; //栈顶的表示下表
String result=""; //结果后缀表达式
/**
* @param editText 获取到文本框的text后条用下面的 * getArray方法获取到数字和操作符的数组进行循环遍历操作 */
public String getHuZhui(String editText)
{
System.out.println("进入方法");
if(editText!=""&&editText.length()>0)
{
System.out.println(editText);
//将string转为数组
ArrayList str=getArray(editText);
System.out.println("进入操作");
System.out.println("调用的大小:"+str.size());
//传来的字符串长度不为零才有效,遍历所有的操作符,放入堆栈中
for(int i=0;i
{
System.out.println("操作符号:"+str.get(i));
System.out.println("进入循环");
if(str.get(i).equals("(")) //碰到左括号就入栈
{
code[++top]="(";
System.out.println("栈值:"+code[top]);
System.out.println("左括号");
}
else if(str.get(i).equals("*")) //碰到乘号,如果栈顶是除号则推出除号
{
while("/".equals(code[top]))
{
result+=code[top]+","; //操作符出栈
top--;
}
code[++top]="*"; //乘号入栈
System.out.println("栈值:"+code[top]);
System.out.println("乘号");
}
else if(str.get(i).equals("/")) //碰到乘号,如果栈顶是除号就出栈
{
while("*".equals(code[top]))
{
result+=code[top]+","; //操作符出栈
top--;
}
code[++top]="/"; //除号入栈
System.out.println("栈值:"+code[top]);
System.out.println("除号");
}
else if(str.get(i).equals("+"))
{
while(("*".equals(code[top]))||("/").equals(code[top])||("-").equals(code[top]))
{
result+=code[top]+","; //操作符出栈
top--;
}
code[++top]="+"; //加号入栈
System.out.println("栈值:"+code[top]);
System.out.println("加号处理后:"+result);
}
else if(str.get(i).equals("-"))
{
while(("*".equals(code[top]))||("/").equals(code[top])||("+").equals(code[top]))
{
result+=code[top]+","; //操作符出栈
top--;
}
code[++top]="-"; //减号入栈
System.out.println("栈值:"+code[top]);
System.out.println("减号打印结果:"+result);
}
else if(str.get(i).equals(")"))
{
System.out.println(top);
System.out.println("---------");
System.out.println(code[top]);
System.out.println("---------");
//碰到右括号时就出栈直到退到左括号
while(!"(".equals(code[top]))
{
result+=code[top]+",";
top--;
}
top--; //去掉左括号的栈顶值
System.out.println("栈值:"+code[top]);
System.out.println("右括号打印结果:"+result);
}
else
{
//时数值的话就直接保存到字符串中
result+=str.get(i)+",";
System.out.println("数字");
}
//System.out.println(result);
}
//字符串循环遍历结束后,如果堆栈的值不为空则输出结果
System.out.println(top);
while(top>=1) //栈值是从1开始的 所以遍历是到一就可以结束了
{
System.out.println("最后循环的结果:"+code[top]);
result+=code[top]+",";
top--;
}
System.out.println("操作最后结果:"+result);
return result;
}
else
{
return "";
}
}
/**
* @param text
* @return参数为文本框的string * 调用getHuZhui()方法获取到后缀表达式,最后再计算结果 */
public String countString(String text)
{
String resultString=getHuZhui(text);
top=0;
String[] result=resultString.split(",");
System.out.println("结果字符串数组长度:"+result.length);
for(int i=0;i
{
System.out.println("----"+result[i]);
if(isNum(result[i]))
{
code[++top]=result[i]; //如果是数字就入栈
}
else if("+".equals(result[i])) //加号处理
{
code[top-1]=String.valueOf(Double.valueOf(code[top-1])+Double.valueOf(code[top])); //取出栈的第一个和第二个相加再赋给第二个
top=top-1;
System.out.println(code[top]);
}
else if("-".equals(result[i])) //减号处理
{
code[top-1]=String.valueOf(Double.valueOf(code[top-1])-Double.valueOf(code[top]));
top=top-1;
System.out.println(code[top]);
}
else if("*".equals(result[i])) //减号处理
{
code[top-1]=String.valueOf(Double.valueOf(code[top-1])*Double.valueOf(code[top]));
top=top-1;
System.out.println(code[top]);
}
else if("/".equals(result[i])) //减号处理
{
code[top-1]=String.valueOf(Double.valueOf(code[top-1])/Double.valueOf(code[top]));
top=top-1;
System.out.println(code[top]);
}
}
System.out.println("运算结果:"+code[top]);
return code[top];
}
/**
* @param text
* @return 获取第一步需要操作的数组 * 比如(1.2+3)*5-4 转化为集合后为 (,1.2,+,3,),*,5,-,4 * 主要还是将有小数点的数字保存在一个整体里面 */
public ArrayList getArray(String text)
{
String demo="";
System.out.println("数字函数:"+text);
ArrayList list=new ArrayList();
for(int i=0;i
{
String s=text.substring(i,i+1);
System.out.println("截取:"+s);
//System.out.println(s+"?");
if(isNum(s))
{
demo+=s; //如果时数字就加到临时变量中
}
else if(".".equals(s))
{
demo+=s; //如果时点号就加到临时变量中
}
else
{
if(!"".equals(demo))
{
list.add(demo); //当遍历到操作符时,查看临时变量中是否有值
list.add(s); //添加操作符到集合中
}
else
{
list.add(s);
}
demo=""; //使用后清空临时变量
}
}
if(demo!="")
list.add(demo);
System.out.println("循环结束");
for(int i=0;i
{
System.out.println(list.get(i)+">");
}
System.out.println("函数中的大小:"+list.size());
return list;
}
/**
* @param str
* @return 判断是否时数字
*/
public boolean isNum(String str) {
return str.matches("^(([0-9]+)([.]([0-9]+))?|([.]([0-9]+))?)$");
}
}