题库
一、有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。原题
用栈解法(个人想法)
观察题目的括号要求,发现后出现的左括号要先配对,符合栈后进先出的思维。
代码如下:
Stack<Character> st = new Stack<Character>();
for(int i = 0;i < s.length();i++) {
char ch = s.charAt(i);
if(ch=='(' || ch=='[' || ch=='{')
st.push(ch);
else {
if(st.isEmpty())
return false;
char c = st.pop();
if(c == '(') {
if(ch != ')')
return false;
}else {
if(c == '[') {
if(ch != ']')
return false;
}else {
if(ch != '}')
return false;
}
}
}
}
if(st.isEmpty())
return true;
else
return false;
二、用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
说明:
你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。原题
1.构造函数和属性
建立两个栈st1和st2,建立表示队列首元素的front。
代码如下:
private Stack<Integer> st1 = new Stack<Integer>();
private Stack<Integer> st2 = new Stack<Integer>();
private int front;
public MyQueue() {
}
2.push函数
若st1栈为空,则压入的元素将作为队列的头元素
代码如下:
public void push(int x) {
if(st1.isEmpty())
front = x;
st1.push(x);
}
3.pop函数
如果st2栈为空,则把st1栈的元素提出并压入st2栈,这样原本先进后出的顺序就变成先进先出了。
代码如下:
public int pop() {
if(st2.isEmpty()) {
while(!st1.isEmpty())
st2.push(st1.pop());
}
return st2.pop();
}
4.peek函数
如果st2栈有元素,则队列的头元素是st2栈的栈顶元素,如果没有元素,则返回front的值。
代码如下:
public int peek() {
if(!st2.isEmpty())
return st2.peek();
return front;
}
5.empty函数
判断队列是否为空,只需要判断st1和st2两个栈是否为空就行。
代码如下:
public boolean empty() {
return st1.isEmpty() && st2.isEmpty();
}