自己实现一个栈结构

明白一个概念:

 栈:是一种特殊的数据结构,特数性在于:栈本身是数组或者链表,常用的是数组

特点:

 LIFO:后进先出

生活场景:叠加盘子,取盘子

2.栈在函数中的调用

package com.redis.algorithm.stack;


/**
 * 栈:一种特殊的数据结构,是数组或者链表
 *
 * @param <Item>
 */
package com.redis.algorithm.stack;

public interface MyStack<Item> {

    MyStack<Item> push(Item item);   //入栈

    Item pop();   //出栈

    int size();

    boolean isEmpty();
}
public class ArrayStack<Item> implements MyStack<Item> {

    private Item[] a = (Item[]) new Object[1];   //
    private int n = 0;   //初始的元素个数

    public ArrayStack(int cap) {
        a = (Item[]) new Object[cap];    //初始化的时候,指定大小,这样就不需要扩容
    }

    @Override
    public MyStack<Item> push(Item item) {
        judgeSize();   //判断容量,是不是需要扩容
        a[n++] = item;   //向数组中添加元素
        return null;
    }

    private void judgeSize() {
        if (n <= a.length) {    //元素的个数已经超出了数组的容量,进行扩容
            resize(2 * a.length);
        } else if (n > 0 && n <= a.length / 2) {
            resize(a.length / 2);   //动态缩容
        }
    }

    private void resize(int size) {
        //扩容:建立一个临时的变量进行扩容,数的赋值关系
        Item[] temp = (Item[]) new Object[size];
        for (int i = 0; i < n; i++) {
            temp[i] = a[i];
        }
        a = temp;
    }


    @Override
    public Item pop() {  //出栈
        if (isEmpty()) {
            return null;
        }
        Item item = a[--n];    //--n 把n减了在用,n--用了在减
        a[n] = null;
        return item;   //默认值为null
    }

    @Override
    public int size() {
        return n;  //默认值为0
    }

    @Override
    public boolean isEmpty() {
        return n == 0;   //默认值为false
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
共享是两个共享一个数组空间的数据结构,可以在数组的两端分别设置两个顶,实现两个的同时操作。以下是一个基于数组实现的共享示例代码: ```c++ #include <iostream> using namespace std; const int MAXSIZE = 100; // 数组的最大容量 class SharedStack { private: int data[MAXSIZE]; // 数组空间 int top1; // 1的顶指针 int top2; // 2的顶指针 public: SharedStack() { // 初始化顶指针 top1 = -1; top2 = MAXSIZE; } // 向1中压入元素 bool push1(int x) { if (top1 + 1 == top2) // 满,无法压 return false; data[++top1] = x; // 将元素压入1中 return true; } // 从1中弹出元素 bool pop1(int& x) { if (top1 == -1) // 空,无法弹出 return false; x = data[top1--]; // 将1的顶元素弹出 return true; } // 向2中压入元素 bool push2(int x) { if (top1 + 1 == top2) // 满,无法压 return false; data[--top2] = x; // 将元素压入2中 return true; } // 从2中弹出元素 bool pop2(int& x) { if (top2 == MAXSIZE) // 空,无法弹出 return false; x = data[top2++]; // 将2的顶元素弹出 return true; } }; int main() { SharedStack s; s.push1(3); s.push1(5); s.push2(6); s.push2(9); int x; s.pop1(x); // 从1中弹出元素 cout << "Pop from stack 1: " << x << endl; s.pop2(x); // 从2中弹出元素 cout << "Pop from stack 2: " << x << endl; return 0; } ``` 在上面的示例代码中,我们定义了一个 `SharedStack` 类来表示共享,其中使用了一个大小为 `MAXSIZE` 的数组 `data` 来存储元素,并定义了两个顶指针 `top1` 和 `top2` 来表示两个顶位置。当向1中压入元素时,我们将元素压入数组下标为 `top1+1` 的位置,并将 `top1` 加一;当从1中弹出元素时,我们将 `top1` 减一,并将数组下标为 `top1` 的元素弹出。对于2的操作也是类似的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值