List、Stack与Queue的综合应用

it2023-06-19  76

List、Stack与Queue的综合应用

package Exp5; /* * 综合练习:输入一个对整数进行四则运算的式子(如10+24/3-4*5+6), * 将其中的运算数和运算符顺序保存在一个List集合里(元素类型为String)。 * 涉及:ArrayList、Queue或Stack */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.Deque; import java.util.LinkedList; import java.util.List; import java.util.Stack; public class Client { public static void main(String[] args) { System.out.print("请输入要计算的四则运算表达式:"); //如10+24/3-4*5+6 try { /*InputStream is = System.in; //字节输入流 InputStreamReader isr = new InputStreamReader(is); //字符流 BufferedReader br = new BufferedReader(isr);*/ //缓冲字符流 String expStr=(new BufferedReader(new InputStreamReader(System.in))).readLine(); //System.out.println(expStr); //PrintStream printStream = System.out; //打印流 //准备工作:需要把数和运算符分隔 //分离出数据;+和*是Java正则处理的特殊字符,因此,需要使用转义符。 String[] nums = expStr.split("\\+ |- | \\* | /"); //必须使用|或,而不是||或 // 因为 + 和 * 在正则表达式里分别代表匹配1次及以上 0次及以上 所以要使用转义字符\ System.out.println("测试参加运算的整数:"+Arrays.toString(nums)); //LinkedList表示链表,接口Queue继承List,接口Deque继承Queue //LinkedList是基于链表实现的,从源码可以看出是一个双向链表。 //LinkedList除了当做链表使用外,它也可以被当作堆栈、队列或双端队列进行操作。 //LinkedList不是线程安全的 //Queue<String> opQueue = new LinkedList<String>(); //创建存取运算符的队列 Deque<String> opQueue = new LinkedList<String>(); //创建存取运算符的队列 Stack<String> opStack=new Stack<>(); //创建存取运算符的栈 for(int i=0;i<expStr.length();i++) { //从运算表达式里取运算符 String temp=expStr.substring(i,i+1); //取一个字符 if(temp.equals("+")||temp.equals("-")||temp.equals("*")||temp.equals("/")) { opQueue.add(temp); //加到队列opQueue(队尾) opStack.push(temp); //压栈方法push() } } System.out.println("测试参加运算的运算符队列:"+opQueue); //先进先出 List<String> list=new ArrayList<String>(); //存储表达式元素的列表 for(int i=0;i<nums.length;i++) { //遍历运算数数组 list.add(nums[i]); /*if(opQueue.peek()!=null) { //获取队首元素peek();运算符个数比运算数少1 list.add(opQueue.poll()); //出队操作poll();从队列取出元素添加至list }*/ if(!opStack.isEmpty()) { //栈不空时 list.add(opStack.pop()); //出栈方法pop() } } System.out.print("使用运算数数组与运算符队列(或栈)构建的表达式:"); for(String ss:list) { //输出运算表达式 System.out.print(ss); } System.out.println(); //换行 System.out.println("列表元素个数:"+list.size()); //输出列表个数 System.out.println("运算数个数:"+nums.length); //输出数组长度 System.out.println("运算符队列个数:"+opQueue.size()); //输出队列元素的个数 System.out.println("运算符队列空吗?"+opQueue.isEmpty()); //测试队列是否空 } catch (IOException e) { e.printStackTrace(); } } } 请输入要计算的四则运算表达式:10+24/3-4*5+6 测试参加运算的整数:[10+24/3-4*5+6] 测试参加运算的运算符队列:[+, /, -, *, +] 使用运算数数组与运算符队列(或栈)构建的表达式:10+24/3-4*5+6+ 列表元素个数:2 运算数个数:1 运算符队列个数:5 运算符队列空吗?false
最新回复(0)