数据结构学习笔记之队列和栈

9 篇文章 1 订阅
6 篇文章 1 订阅

初学队列queue

引例:解密QQ号
解密规则如下:给入一串数字,首先将第一个数删除,再将第二个数放在末尾,再删除第三个数将第四个数放在末尾,再将第五个数删除······以此类推·最后把删除的数字依次序读出。
例如:123456 ==> 34562 ===> 5624 ===> 246 ===> 64 ===>4

======> 135264

我们引出两个整型变量 head和tail。head用来记录队列的队首,tail用来记录队列的对尾的下一个位置。

我们在这里利用队列,顾名思义队列就是和排队一样,先进先出,他只允许队列的首部head删除,称为“出队”;在尾部tail进行插入操作。

基础代码如下://题目来源:啊哈!算法
631758924破译

#include<stdio.h>
//#include<stdlib.h>

int main()
{
    int a[102]={0,6,3,1,7,5,8,9,2,4};
    int head = 1;
    int tail = 10;
    while(head<tail)
    {
        printf("%d", a[head]);
        head++;

        a[tail] = a[head];
        tail++;

        head++;
    }
    printf("\n");

  //  system("pause");
}

栈的初学

队列是一种先进先出的数据结构,还有一种后进先出的数据结构——栈

(1.2.3)其中1在顶部,3在底部,把他想象成在一个桶里,放的顺序是3.2.1而我们取出来的顺序是1.2.3,这种最后放入却最早出来的数据结构就叫做栈。

//举个例子:判断回文串,如果是11211,那么返回YES,haa,则返回NO

/*
先出后进的数据结构  ----栈
栈的实现: 一维数组+指向栈顶的变量top
*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
    char a[101];
    gets(a);
    int len = strlen(a);
    int mid = len / 2 ;
    char s[101];
    int top = 0;
    for (int i = 0; i < mid;i++)
        s[++top] = a[i];

    if(len%2!=0)
        mid += 1;

    for (int j = mid; j < len;j++)
    {
        if(a[j]==s[top])
        {
            top--; 
        }
    }

    if(top==0)
        printf("YES");
    else
        printf("NO");

    system("pause");
    return 0;

}
 

我们解析一下这个代码:
13231,现将其分成两个部分,13和231,我们将13存入栈stack[ ]中,然后mid+1,将原字符串中的31依次与栈中的13对比,对比一次top-1。后放入的3先进行比较。

适合的括号

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

有效字符串需满足:

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

示例 1:

输入:s = “()”
输出:true
示例 2:

输入:s = “()[]{}”
输出:true
示例 3:

输入:s = “(]”
输出:false
示例 4:

输入:s = “([)]”
输出:false
示例 5:

输入:s = “{[]}”
输出:true

提示:

1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses

解题思路
1.判断输入字符串是否为奇数,是,直接return false;(匹配为偶数)//‘[’等例子
2.如果是‘(’,‘{’,‘[’,就入栈
3.从stack[1]开始,stack[0]保留除括号外其他字符,防止每次开头为括号的右半侧。//“)(”、“()()))(”等例子
4.如果栈中的左半侧与右半侧不匹配直接return false;//“(])”等例子
5.如果匹配top–,最后判断top为0 则ture 否则 false。

代码

bool isValid(char * s){
    int len = strlen(s);

    char stack[len+1];
    int top = 0;
    char stack[0] = '0';

    if(len%2!=0)
        return false;

    if((s[0]!='{')&&(s[0]!='(')&&(s[0]!='['))
      //  return false;

    for(int i=0; i < len;i++)
    {
        if((s[i]=='{')||(s[i]=='(')||(s[i]=='['))
            stack[++top] = s[i];
        else if((s[i]=='}')||(s[i]==']')||(s[i]==')'))
        {
            char a = stack[top];
            if((a!='{')&&(a!='(')&&(a!='['))
                return false;
            if((a == '{' && s[i] != '}') || (a == '(' && s[i] != ')') || (a== '[' && s[i] != ']'))
            {
                return false;
            }
            top--;
        }
    }

    if(top==0)
        return true;
    else
        return false;

}

作者:xiao-yang-yang-e

上面是我学习栈之后在力扣上做的题,官方代码如下:C语言

char pairs(char a) {
    if (a == '}') return '{';
    if (a == ']') return '[';
    if (a == ')') return '(';
    return 0;
}

bool isValid(char* s) {
    int n = strlen(s);
    if (n % 2 == 1) {
        return false;
    }
    int stk[n + 1], top = 0;
    for (int i = 0; i < n; i++) {
        char ch = pairs(s[i]);
        if (ch) {
            if (top == 0 || stk[top - 1] != ch) {
                return false;
            }
            top--;
        } else {
            stk[top++] = s[i];
        }
    }
    return top == 0;
}

作者:LeetCode-Solution

OK~今日笔记于此止!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值