首页 > 其他分享 >验证出栈顺序是否正确题解&队列

验证出栈顺序是否正确题解&队列

时间:2025-01-12 18:34:16浏览次数:3  
标签:出栈 队列 题解 return int front ListNode rear

(1)验证出栈顺序是否正确

队列遵循先入后出的原则,故需要一个数组来模拟记录入栈和出栈

再分别对出栈顺序进行遍历验证是否正确

#include <iostream>
using namespace std;
# define m 100000
int b[m], a[m], c[m];
int main() {
	int t;
	cin >> t;
	while (t--) {
		int n;
		cin >> n;
		for (int i = 0; i < n; i++) {
			cin >> a[i];
		}
		for (int j = 0; j < n; j++) {
			cin >> b[j];
		}
		int x = 0, y = 0, z = 0;
		//先入后出
		while (x < n&& y < n&&z < n) {
			c[x] = a[y];//在c中进行出栈和入栈
			while (c[x] == b[z]) {
				if (z < n) z++;
				if (x > 0)x--;
				else break;
			}
			x++;
			y++;
		}
		while (c[x] == b[z]&&z<n) {
			 if(z  < n) z++;
			 if (x > 0)x--;
			 else break;
		}
		if (z == n) {//遵循先入后出的原则并且能够遍历b,说明出栈顺序正确
			cout << "Yes\n";
		}
		else {
			cout << "No\n";
		}

	}

	return 0;
}

第一个while循环先用c数组实现出栈和入栈对b数组进行检索如果有先入栈又立即出栈的元素则c数组中不记录该元素,对b数组中下一个元素进行检查

若没有先入栈又立即出栈的元素则第一个while循环将a数组复制给数组再对b进行遍历,再进行计数

在c++中也可用stack函数来进行入栈和出栈思路大致相同

(2)队列

只允许在一段进行插入另一端进行删除的线性表

重要术语:队头,队尾,空队列,队头元素,队尾元素

重要特性:先入先出,后入后出

1.队列的顺序实现

1.队列的创建

# define max 10
typedef sturct{
int date[max];
int front;
int rear;
}sqQueue
void initqueue(sqQueue&s){
s.front=0;//初始化队头指针和队尾指针
s.rear=0;
} 
void testqueue(){
sqQueue s;
initqueue(s);
}

通过判断队头队尾是否相等来判断队列是否为空

2.入队

bool qnqueue(sqQueue& s,int t){
    if ((s.rear + 1) % max == s.front) {
        return false;
    }
    else {
        s.dat[s.rear] = t;//循环队列
        s.rear = (s.rear + 1) % max;
        return true;
    }

}

3.查

bool qnqueue(sqQueue& s,int& t){
    if (s.rear == s.front) {
        return false;
    }
    else {
        s.dat[s.rear] = t;
        return true;
    }

}

4.出队

bool qnqueue(sqQueue& s,int &t){
    if (s.rear== s.front) {
        return false;
    }
    else {
        s.dat[s.front] = t;
        s.front = (s.front+ 1) % max;
        return true;
    }

}

循环队列要判断队列是否已满则要看队尾指针的后面一位是否为队头指针,故if条件中用的是s.rear + 1) % max == s.front

如果不想浪费最后一片空间则可以在队列中定义一个int size,入队则size++,出队则size--

若最后size==max则说明队满,也可定义一个int frion,用来记录操作,删除为1则队空,插入为0队满

队尾指针指向不同位置时增删查改也会不同

判断队列中的元素个数t=(s.rear+max-s.front)%max

2.队列的链式实现

1.创建一个队列

typedef struct ListNode {
    int val;               
    struct ListNode* next;
} ListNode;

typedef struct {
    ListNode* front;
    ListNode* rear;
} linkqueue;
//初始化一个队列
void initqueue(ListNode&q){
   q.front=q.rear = (ListNode*)malloc(sizeof(ListNode));
    q.front->next = NULL;
}
void testqueue() {
    linkqueue s;
    initqueue(s);
}

带头节点判断队列是否为空只需要判断头指针是否指向NULL或者front和rear是否指向同一节点

不带头节点判断队列是否为空只需判断front或者rear是否等于NULL即可

2.入队

(1)带头节点的插入

void enqueue(linkequeue& q, int t) {
    listnode*s=(ListNode*)malloc(sizeof(ListNode));
    s->date = t;
    s->next = NULL;
    q.rear->next = s;
    q.rear = s;
}

(2)不带头节点的插入

void enqueue(linkequeue& q, int t) {
    listnode*s=(ListNode*)malloc(sizeof(ListNode));
    s->date = t;
    s->next = NULL;
    if (q.front = NULL) {
        q.front = s;
        q.rear = s;
    }
    q.rear->next = s;
    q.rear = s;
}

3.出队

(1)带头节点

bool dequeue(linkequeue& q, int& t) {
    if (q.front == q.rear) {
        return false;
    }
    listnode* s = (ListNode*)malloc(sizeof(ListNode));
    x = s->date;
    q.front->next = s->next;
    if (s== q.rear) {
        q.rear->next = q.front;
    }
    free(s)
        return true;
}

(2)不带头节点

bool dequeue(linkequeue& q, int& t) {
    if (q.front == NULL) {
        return false;
    }
    listnode* s = q.front;
    x = s->date;
    q.front = s->next;
    if (s == q.rear) {
        q.rear= NULL;
        q.front= NULL;
    }
    free(s)
        return true;
}
3.双端队列

输出受限

删除受限

不同的受限出队列方式不同

标签:出栈,队列,题解,return,int,front,ListNode,rear
From: https://blog.csdn.net/2401_88455976/article/details/145092072

相关文章

  • THUWC 2020 Day3 题解
    Cache一致性协议按照学习手册最后的模拟。\(\text{Exclusive}/\text{Shared}\)只有编号最小的返回,但都要改变状态。\(\text{Modified}\)的所有的都要返回且改变状态。Cache替换算法这里说一下\(\text{PLRU}\)算法。对于每次,先找是否命中。如果是否,就在二叉搜索树上......
  • 2021 年 3 月青少年软编等考 C 语言五级真题解析
    目录T1.红与黑思路分析T2.密室逃脱思路分析T3.求逆序对数思路分析T4.最小新整数思路分析T1.红与黑有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计......
  • Codeforces Round 734 (Div. 3) 题解
    建议开题顺序:A,B1,B2,C,E,F,D1,D2。A.PolycarpandCoins记\(k=\min(c1,c2)\),则\((c1-k)\times1+(c2-k)\times2+k\times3=n\)。注意到\(n\mod3\)为\(0,1,2\)。所以我们\(|c1-c2|\)最多为\(1\),只需要将\(n\mod3\)给\(1\)或\(2\)即可。B1.WonderfulColo......
  • 数据结构:栈(Stack)和队列(Queue)—面试题(一)
    目录1、括号匹配2、逆波兰表达式求值 3、栈的压入、弹出序列4、最小栈 1、括号匹配习题链接https://leetcode.cn/problems/valid-parentheses/description/描述:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必......
  • Redis 是一个开源的高性能键值对存储数据库,通常被用作缓存、消息队列和持久化数据库。
    Redis服务器是什么?Redis是一个开源的高性能键值对存储数据库,通常被用作缓存、消息队列和持久化数据库。Redis支持多种数据结构,如字符串、哈希、列表、集合、有序集合、位图等。它被广泛用于需要快速读写操作、低延迟的场景。Redis可以作为一个独立的数据库使用,也可以作为缓......
  • P5025 [SNOI2017] 炸弹 题解
    题意link.题解我们充分发扬人类智慧。考虑到可能连锁爆炸,我们不能通过一个单纯的二分来解决问题。考虑\(dp\)。记\(f(i)\)为第\(i\)个点爆炸,最远能引爆到哪个坐标小于它的点。\(g(i)\)为第\(i\)个点爆炸,最远能引爆到哪个坐标大于它的点。我们以\(f\)为例,\(g\)......
  • AT_abc388_f Dangerous Sugoroku 题解
    太幽默了。显然可以用矩阵快速幂解决,矩阵里维护距离当前点\(B\)以内的所有点可不可达,转移只需分段,在区间内和不在区间内用不同的转移矩阵即可。复杂度\(O(B^3m\logn)\)。然后你就T了。此时你很急,你现在应该快点卡常来AK这场比赛而不是研究其他的做法,于是我们发现快速幂......
  • Atcoder ABC388F Dangerous Sugoroku 题解 [ 蓝 ] [ 矩阵加速 ] [ 状压矩乘 ] [ 模拟
    DangerousSugoroku:赛时写了矩乘T飞了,受到sunkuangzheng大佬的启发才知道要状压矩乘。暴力矩乘思路直接像过河那样写模拟细节非常多,于是考虑像美食家一样的思路,利用矩阵分段加速。定义\(dp_i\)表示\(i\)能否到达,则有如下转移:\[dp_{i}=\bigvee_{j=i-B}^{i-A}dp_{j}\]......
  • 买房子题解
    【题目要求】问第几年能够买下这套房子。一、建立两个变量,一个表示积攒的钱数,一个表示房价。二、循环20次,判断第i年他能否买下,若能,那么输出i,最后return0。三、在循环外面,输出Impossible。【题解代码】include<bits/stdc++.h>usingnamespacestd;intmain(){double......
  • 整数序列的元素最大跨度值题解
    【题目要求】计算序列的最大跨度值(最大值-最小值)一、求最大值如果a大于最大值,那么最大值就变成a,开始最大值要等于0。二、求最小值如果a小于最小值,那么最小值就变成a,开始最小值要等于1000。【题解代码】include<bits/stdc++.h>usingnamespacestd;intmain(){intn,a,......