LeetCode数据结构_C语言题解系列-栈/队列

题目一.有效的括号

20. 有效的括号icon-default.png?t=N3I4https://leetcode.cn/problems/valid-parentheses/

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

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 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. 用栈实现队列icon-default.png?t=N3I4https://leetcode.cn/problems/implement-queue-using-stacks/

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false
  • 只能 使用标准的栈操作 —— 也就是只有 push to toppeek/pop from topsize, 和 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);
*/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

物质波波波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值