1. 请设计一个顺序堆栈,(用数组来存储堆栈中的数据元素),实现堆栈的push, pop, 和top三个函数,在测试函数中生成堆栈对象并测试push, pop, 和top 三个函数(最少要测试Integer和String两种类型的对象).
package EXP2020.exp11;
import java.util.ArrayList;
/**
* @author JM
* @date 2020/5/19
*/
/**模拟一个顺序栈*/
class SeqStack {
public ArrayList stack = new ArrayList();
//获取栈顶元素
public Object top() {
//取栈顶元素相当于取LinkedList容器的头位置的元素
return stack.get(stack.size() - 1);
}
//入栈
public void push(Object obj) {
stack.add(obj);
}
//出栈
public void pop() {
stack.remove(stack.size() - 1);
}
//重写toString
public String toString() {
return stack.toString();
}
}
/**主类进行测试*/
public class MainTestOne {
public static void main(String[] args) {
//创建一个栈
SeqStack stack = new SeqStack();
Integer i = new Integer(12345);
String str = new String("string");
//测试push存放数据
stack.push(str);
stack.push(i);
stack.push(456);
stack.push("Jack");
stack.push("Tom");
System.out.println("移除数据之前:" + stack);
//测试pop移除栈顶数据
stack.pop();
System.out.println("移除数据之后:" + stack);
//获取栈顶元素
Object topObj = stack.top();
System.out.println("获得栈顶元素:" + topObj);
}
}
2. 用HashSet模拟一个网上购物车。要求:从键盘输入5个商品的编号、名称、单价、购买数量,将这些信息存入一个HashSet,(如果编号相同,则可以在数量上加1,不能重复存入购物车)然后将该HashSet作为参数调用方法getSum(HashSet items),该方法用于计算商品的总价并返回。
package EXP2020.exp11;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author JM
* @date 2020/5/19
*/
/**
* 定义购物车类
*/
class ShoppingCart {
//商品编号、名称、单价、购买数量
public String id;
public String name;
public double price;
public int num;
//初始化构造函数
public ShoppingCart(String id, String name, double price, int num) {
this.id = id;
this.name = name;
this.price = price;
this.num = num;
}
//重写toString方法
public String toString() {
return "商品编号:" + id + " | 商品名称:" + name + " | 价格:" + price + "元/件 | 数量:" + num + "件";
}
//重写hashCode方法
public int hashCode() {
return id.hashCode(); // 返回id属性的哈希值
}
//重写equals
public boolean equals(Object obj) {
if (this == obj) // 判断是否是同一个对象
return true; // 如果是,直接返回true
if (!(obj instanceof ShoppingCart))
return false; // 如果对象不是Commodity类型,返回false
ShoppingCart c = (ShoppingCart) obj;
return this.id.equals(c.id);
}
}
public class MainTestTwo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
HashSet storage = new HashSet();//定义一个容器存放购物信息
int i = 5;//输入5个商品信息
while (i > 0) {
String id = sc.next();
String name = sc.next();
double price = sc.nextDouble();
int num = sc.nextInt();
ShoppingCart com = new ShoppingCart(id, name, price, num);
if (!storage.add(com)) { //如果有一样的
storage.remove(com);
com.num++; //同样的商品数量加1
storage.add(com);
}
i--;
}
//迭代器遍历输出购物信息
System.out.printf("\n======================您的购物信息列表如下:==========================\n");
Iterator it = storage.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
System.out.printf("需要消费总额: %.2f元\n", getSum(storage));
}
//计算总额并返回
public static double getSum(HashSet items) {
double moneySum = 0;
String p;
Iterator it = items.iterator();
while (it.hasNext()) {
p = it.next().toString();
Pattern pattern1 = Pattern.compile("价格:\\d+.\\d+"); //匹配价格
Pattern pattern2 = Pattern.compile("数量:(\\d+)"); //匹配数量
Matcher m1 = pattern1.matcher(p); //传入要匹配的原串
Matcher m2 = pattern2.matcher(p);
while (m1.find() && m2.find()) {
double money = Double.parseDouble(m1.group().substring(3));
int num = Integer.parseInt(m2.group().substring(3));
moneySum += money * num; //计算商品总额
}
}
return moneySum;
}
}
不重复的情况:
重复的情况:
第二题好像方法很多。。。哎。。
3. 写一个彩票程序:30选7。然后从键盘输入7个数,然后随机(1~30之间)生成7个随机数,注意不能重复,对比7个数是否与随机数有相同的。最后显示“中了几个号”。同时,如果中了7个号,显示一等奖;如果中了6个号,显示二等奖;如果中了5个号,显示三等奖。要求:选用合适的容器和算法。(说明:键盘输入可以使用Scanner类)
package EXP2020.exp11;
import java.util.Scanner;
import java.util.TreeSet;
/**
* @author JM
* @date 2020/5/19
*/
public class MainTestThree {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
TreeSet ts = new TreeSet();//定义一个TreeSet容器存放数据
int[] myNumbers = new int[7];
int count = 0;
//输入7个数
System.out.println("请输入7个数:");
for (int i = 0; i < myNumbers.length; i++) {
myNumbers[i] = sc.nextInt();
}
//产生7个1~30之间的随机数,并放在容器里
while (ts.size() < 7) {
ts.add((int) (Math.ceil(Math.random() * 30)));
}
System.out.println("中奖号码有:" + ts);
//显示结果
for (int i = 0; i < 7; i++) {
if (ts.contains(myNumbers[i]))
count++;
}
switch (count) {
case 5:
System.out.println("恭喜获得三等奖");
break;
case 6:
System.out.println("恭喜获得二等奖");
break;
case 7:
System.out.println("恭喜获得一等奖");
break;
default:
System.out.println("谢谢参与");
}
System.out.println("中了"+count+"个号");
}
}