初学队列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~今日笔记于此止!