算法通关村第四关—理解栈手写栈(青铜)

         理解栈手写栈

一、栈的基础知识

1.1 栈的特征

栈和队列是比较特殊的线性表,又称之为访问受限的线性表。栈是很多表达式、符号等运算的基础,也是递归的底层实现。理论上递归能做的题目栈都可以,只是有些问题用栈会非常复杂。
栈底层实现仍然是链表或者顺序表,栈与线性表的最大区别是数据的存取的操作被限制了,其插入和删除操作只允许在线性表的一端进行。一般而言,把允许操作的一端称为栈顶(Toρ),不可操作的一端称为栈底(Bottom),同时把插入元素的操作称为入栈(Push),删除元素的操作称为出栈(Pop)。若栈中没有任何元素,则称为空栈。

1.2 栈的操作

栈的常用操作主要有:
push(E):增加一个元素E
pop():弹出元素E
peek():显示栈顶元素,但是不出栈
empty():判断栈是否为空
我们在设计自己的栈的时候,不管用数组还是链表,都要实现上面几个方法。

1.3 java中的栈

java的util中就提供了栈Stack类,使用不复杂,看一个例子就够了:

public class MainTest{
   
	public static void main(String[]args){
   
		Stack<Integer>stack new stack();
		stack.push(1);
		stack.push(2);
		stack.push(3);
		System.out.println("栈顶元素为:"+stack.peek());
		while (!stack.empty()){
   
			//只显示没出栈
			System.out.println(stack.peek());
			//出栈并且显示
			System.out.println(stack.pop());
		}
	}
}

二、基于数组实现栈

import java.util.Arrays;
class Mystack<T>{
   
	//实现栈的数组
	private Object[] stack;
	//栈顶元素
	private int top;

	Mystack(){
   
		//初始容量为10
		stack new Object[10];
	}
	//判断是否为空
	public boolean isEmpty(){
   
		return top == 0;
	}
	//返回栈顶元素
	public T peek(){
   
		T t = null;
		if (top > 0)
			t = (T) stack[top -1];
		return t;
	}
	public void push(T t){
   
		expandCapacity(top + 1);
		stack[top] = t;
		top++;
	}
	//出栈
	public T pop(){
   
		T t = peek();
		if(top > 0){
   
			stack[top - 1] = null;
			top--;
		}
		return t;
	}
	//扩大容量
	public void expandCapacity(int size){
   
		int len = stack.length;
		if (size > len)
			size = size * 3 / 2 + 1;//每次扩大50%
		stack = Arrays.copyOf(stack, size);
	}
}

三、基于链表实现栈

class ListStack<T>{
   
	//定义链表
	class Node<T>{
   
		public T t;
		public Node next;
	}
	public Node<T>head;
	//构造函数初始化头指针
	ListStack(){
   
		head null;
	}
	//入栈
	public void push(T t){
   
		if (t =null){
   
			throw new NullPointerException("参数不能为空")}
		if (head == null){
   
			head = new Node<T>();
			head.t =t;
			head.next = null;
		}
		else{
   
			Node<T>temp = head;
			head = new Node<>();
			head.t = t;
			head.next = temp;
		}
	}
	//出栈
	public T pop(){
   
		if (head == null){
   
			return null;
		}
		T t = head.t;
		head = head.next;
		return t;
	}
	//取栈顶元素
	public T peek(){
   
		if (head == null){
   
			return null;
			T t = head.t;
			return t;
		}
	}
	//栈空
	public boolean isEmpty(){
   
		if (head == null)
			return true;
		else
			return false;
	}
}

相关推荐

  1. 算法通关理解(青铜)

    2023-12-05 20:56:05       39 阅读
  2. 算法通关十一理解位运算的规则(青铜)

    2023-12-05 20:56:05       28 阅读
  3. 算法通关十八 | 青铜 | 回溯

    2023-12-05 20:56:05       45 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-05 20:56:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-05 20:56:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-05 20:56:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-05 20:56:05       20 阅读

热门阅读

  1. flutter记录报错日志

    2023-12-05 20:56:05       43 阅读
  2. 讲讲ES6中 对象合并

    2023-12-05 20:56:05       38 阅读
  3. C语言还会存在多久

    2023-12-05 20:56:05       35 阅读
  4. Kotlin 作用域函数:理解 apply, let, 和 with

    2023-12-05 20:56:05       30 阅读
  5. 设计模式 -职责链模式

    2023-12-05 20:56:05       41 阅读
  6. 9-MapReduce开发技术

    2023-12-05 20:56:05       27 阅读
  7. php获取时间和MongoDB保存时间不一致

    2023-12-05 20:56:05       34 阅读
  8. [Tricks] 记各类欧拉回路问题

    2023-12-05 20:56:05       34 阅读