堆栈中PUSH与POP
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆栈中PUSH与POP相关的知识,希望对你有一定的参考价值。
设(SS)=3300H,(SP)=1140H,在堆栈中压入5个字数据后,又弹出两个字数据,则(SP)=113AH
压入5个字数据,弹出两个字数据。就相当于压入3个字数据(先压入的那3个字数据)
经过这样后,堆栈指针(SP)是怎么从1140H变成113AH,也就是怎么算的?
原来加和减,都是十六进制数所,难怪
那为什么是十六进制数呢
相反,每执行一次字数据的出栈,sp的内容加2。
所以压入3个字后,sp=sp-6=1140h-0006h=113ah 参考技术A 你都移动4个bit
位了,怎么可能是2呢?第二次shr
eax,4.
eax=2.
可是你与是1001(5),当然是0了。 参考技术B 它是压的和弹的都是字呀,不是字节,所以呢,每次要加2,或减2,所以结果应该是sp-6,就是113ah了呀
JavaExp11:范型与容器
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+"个号");
以上是关于堆栈中PUSH与POP的主要内容,如果未能解决你的问题,请参考以下文章