数据结构与算法第一期:栈,链表,队列

编程学习第一次作业

本周主要学习的数据结构有栈、队列和链表。需要实现一些基本的数据结构,和完成相应的LeetCode算法题。本作业都是通过Java编写的。

1.栈

1.1 编程实现特定需求

  • 用数组实现一个顺序栈
public class ArrayStack {
   
	private String[] items;
	private int count;
	private int n;
	
	//构造一个容量为n的Stack
	public ArrayStack(int n) {
   
		this.items = new String[n];
		this.n = n;
		this.count = 0;
	}
	
	public boolean push(String item) {
   
		if (count == n) {
   
			return false;
		}
		items[count] = item;
		count++;
		return true;
	}
	
	public String pop() {
   
		if (count == 0) {
   
			return null;
		}
		String item = items[count-1];
		items[count-1] = null;
		count--;
		return item;
	}
	
	//为浏览器的实现所添加的一个类
	public String showTop() {
   
		return items[count-1];
	}
	
	public void erase() {
   
		for (int i=0;i<n;i++) {
   
			items[i] = null;
		}
	}
	
	@Override
	public String toString() {
   
		return "ArrayStack [items=" + Arrays.toString(items) + ", count=" + count + ", n=" + n + "]";
	}
	//测试用例
	public static void main(String[] args) {
   
		ArrayStack stack = new ArrayStack(2);
		System.out.println("是否压入栈中: "+ stack.push("AAA"));
		System.out.println("是否压入栈中: "+ stack.push("BB"));
		System.out.println("是否压入栈中: "+ stack.push("CCC"));
		
		System.out.println(stack);
		System.out.println(stack.pop());
		System.out.println(stack.pop());
		System.out.println(stack.pop());
	}
}
  • 用链表实现一个链式栈

    此处实现用了泛型去处理,这样该链式栈可以存储各种数据类型的数据,具有通用性。

public class LinkedListStack {
   

	public Node head;
	public Node current;
	public int N;

	class Node<T> {
   
		public T data;
		public Node next;

		public Node(T data) {
   
			this.data = data;
		}
	}

	public <T> void push(T data) {
   
		if (head == null) {
   
			head = new Node(data);
			current = head;
		} else {
   
			current.next = new Node(data);
			current = current.next;
		}
		N++;
	}

	public <T> T pop() {
   
		T data = null;
		if (N == 0) {
   
		} else if (N == 1) {
   
			data = (T) head.data;
			head = null;
		} else {
   
			for (Node x = head; x != null; x = x.next) {
   
				if (x.next.next == null) {
   
					data = (T) x.next.data;
					x.next = null;
				}
			}
		}
		N--;
		return data;
	}

	public static <T> void main(String[] args) {
   
		LinkedListStack stack = new LinkedListStack();
		stack.push(2);
		stack.push("AAA");
		stack.push(23.2);
		System.out.println((T) stack.pop());
		System.out.println((T) stack.pop());
		System.out.println((T) stack.pop());
		System.out.println((T) stack.pop());
	}
}
  • 编程模拟实现一个浏览器的前进、后退功能
public class Browser {
	
	public static void main(String[] args) {
		ArrayStack browserStackX = new ArrayStack(4);
		ArrayStack browserStackY = new ArrayStack(4);
		// 记录浏览的网页,并将其压入X栈中,每次压入是执行清空Y栈内容操作
		browserStackX.push("www.baidu.com");
		browserStackY.erase();
		browserStackX.push("www.qq.com");
		browserStackY.erase();
		browserStackX.push("www.taobao.com");
		browserStackY.erase();
		//查看X栈栈顶元素,这就是当前浏览的网页taobao
		System.out.println("当前浏览的网页:"+browserStackX.showTop());
		//通过将taobao弹出并压入到Y栈中实现后退,到qq
		browserStackY.push(browserStackX.pop());
		System.out.println(browserStackX.showTop());
		//通过将qq弹出并压入到Y栈中实现后退,到baidu
		browserStackY.push(browserStackX.pop());
		//此时当前浏览的网页就是baidu
		System.out.println(browserStackX.showTop());
		
		System.out.println("**  打开一个新网页4399  **");
		//将4399压入X栈,并且清空Y栈,
		browserStackX.push("4399");
		browserStackY.erase();
		
		//此时当前浏览的网页就是4399,由于清空了Y栈,已经无法再回退到taobao,qq
		System.out.println("当前浏览的网页:"+browserStackX.showTop());
		System.out.println(browserStackX);
		System.out.println(browserStackY);
	}
}

1.2完成相应的LeetCode算法题

  • Valid Parentheses(有效的括号)20

    给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。

    有效字符串需满足:

    1. 左括号必须用相同类型的右括号闭合。
    2. 左括号必须以正确的顺序闭合。

    注意空字符串可被认为是有效字符串。

    思路:

    凡是涉及到括号的问题,都可以用栈,这一种数据结构去解决,此处是括号的匹配,因此开始遍历整个字符串,凡是遇到'(' 就往栈中压入与其对应的 ')' ,同理'{' ']' 也是做一样的处理。

    一旦遍历到的字符是括号的右半部分,则通过判断栈是否为空,以及栈中弹出的字符是否与遍历到的这个字符相等来返回是否有效,此处主要是返回无效的情况。

    最后,经过这一系列操作,如果是有效的括号字符串则最终栈应该为空,如若栈中还有东西,则说明出现了括号没有匹配的情况,即该括号字符串是无效的。通过返回stack.isEmpty() 来实现最后的判断。

    public boolean isValid(String s) {
         
    		if (s == null || s.length()==0)	return true;
    		Stack<Character> stack = new Stack<>();
    		for (int i=0; i < s.length(); i++) {
         
    			if (s.charAt(i) == '(') {
         
    				stack.push(')');
    			} else if (s.charAt(i) == '[') {
         
    				stack.push(']');
    			} else 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值