题目一.有效的括号
20. 有效的括号https://leetcode.cn/problems/valid-parentheses/
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true示例 2:
输入:s = "()[]{}" 输出:true
1.思路分析
括号匹配问题是栈最经典的应用场景之一,思路非常简单:由于题干提示输入全为括号,无其他字符数据,故不用进行边界条件判断:
1.扫描到左括号'('、'['、'{'入栈
2.扫描到右括号')'、']'、'}'出栈匹配,不匹配返回false
3.循环结束后,栈空返回true,否则返回false
其中第三点非常容易被遗忘,栈非空说明有未配对的左括号,也是不匹配的。
2.AC代码
struct stack{
char sta[10000];
int top;
};
void push(struct stack* s,char p){
s->top++;
s->sta[s->top]=p;
}
char pop(struct stack* s){
if(s->top>=0){
char ret=s->sta[s->top];
s->top--;
return ret;
}
else return '0';
}
bool isValid(char * s){
struct stack seqstack;
struct stack* seq=&seqstack;
seqstack.top=-1;
for(int i=0;i<strlen(s);i++){
if(s[i]=='('||s[i]=='['||s[i]=='{') push(seq,s[i]);
else if(s[i]==')'||s[i]==']'||s[i]=='}') {
char reg=pop(seq);
if((reg=='('&&s[i]!=')')||(reg=='['&&s[i]!=']')||(reg=='{'&&s[i]!='}')) return false;
else if(reg=='0') return false;
}
}
if(seqstack.top==-1) return true;
else return false;
}
题目二.用栈实现队列
232. 用栈实现队列https://leetcode.cn/problems/implement-queue-using-stacks/
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(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.思路分析
本题不涉及算法,仅是数据结构的基本操作,实现方法也多种多样,笔者在此选择用一个顺序栈实现队列:
栈顶元素下标为top,栈底元素下标为0;
入栈和入队操作完全一致,而出队则是直接 将seqstack[0]保存,顺序表整体后移,top--;
以保证队头元素front永远为seqstack[0]。
由题干可知:本题无需考虑非法操作。
2.AC代码
typedef struct {
int seqstack[100];
int top;
} MyQueue;
MyQueue* myQueueCreate() {
MyQueue* stack=(struct MyQueue*)malloc(sizeof( MyQueue));
stack->top=-1;
return stack;
}
void myQueuePush(MyQueue* obj, int x) {
obj->top++;
obj->seqstack[obj->top]=x;
}
int myQueuePop(MyQueue* obj) {
int element;
element=obj->seqstack[0];
for(int i=0;i<obj->top;i++) obj->seqstack[i]=obj->seqstack[i+1];
obj->top--;
return element;
}
int myQueuePeek(MyQueue* obj) {
int element;
element=obj->seqstack[0];
return element;
}
bool myQueueEmpty(MyQueue* obj) {
if(obj->top==-1) return true;
else return false;
}
void myQueueFree(MyQueue* obj) {
free(obj);
}
/**
* Your MyQueue struct will be instantiated and called as such:
* MyQueue* obj = myQueueCreate();
* myQueuePush(obj, x);
* int param_2 = myQueuePop(obj);
* int param_3 = myQueuePeek(obj);
* bool param_4 = myQueueEmpty(obj);
* myQueueFree(obj);
*/