编程学习第一次作业
本周主要学习的数据结构有栈、队列和链表。需要实现一些基本的数据结构,和完成相应的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
给定一个只包括
'('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
思路:
凡是涉及到括号的问题,都可以用栈,这一种数据结构去解决,此处是括号的匹配,因此开始遍历整个字符串,凡是遇到
'('
就往栈中压入与其对应的')'
,同理'{'
']'
也是做一样的处理。一旦遍历到的字符是括号的右半部分,则通过判断栈是否为空,以及栈中弹出的字符是否与遍历到的这个字符相等来返回是否有效,此处主要是返回无效的情况。
最后,经过这一系列操作,如果是有效的括号字符串则最终栈应该为空,如若栈中还有东西,则说明出现了括号没有匹配的情况,即该括号字符串是无效的。通过返回
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