堆栈中PUSH与POP

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆栈中PUSH与POP相关的知识,希望对你有一定的参考价值。

设(SS)=3300H,(SP)=1140H,在堆栈中压入5个字数据后,又弹出两个字数据,则(SP)=113AH

压入5个字数据,弹出两个字数据。就相当于压入3个字数据(先压入的那3个字数据)

经过这样后,堆栈指针(SP)是怎么从1140H变成113AH,也就是怎么算的?
原来加和减,都是十六进制数所,难怪
那为什么是十六进制数呢

每执行一次字数据的入栈,sp的内容减2。
相反,每执行一次字数据的出栈,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的主要内容,如果未能解决你的问题,请参考以下文章

1403 有趣的堆栈

在堆栈中,push为入栈操作,pop为出栈操作

堆栈 pop push

PUSH指令 POP指令

堆栈的三种实现方式

基于C语言堆栈push,pop,destroystack,isEmpty,isFull实现