PTA Pop Sequence ----- 栈的Pop序列的检验

这个题是写的最舒服的一个题了,写完后没有大改,仅仅改了下循环之类的就得到正确答案了,也算是一个小进步:
废话不说,直接上思路:

思路

使用栈的思路,进行比较:

  1. 对于输入的一个序列,从这个序列的第一个元素开始遍历:
  2. 如果这个元素的值大于我们栈顶的值或者栈为空,那么就入栈(注意可能会有栈满时还要入站的情况),直到栈顶等于这个元素
  3. 然后弹出栈顶元素,接下来对这个序列的下一个元素开始判断

注意:

  1. 当你在往栈里增加元素的时候,一定要注意不要超过最大的容量,也要注意压栈的值是递增的1,2,…,N;
  2. 当你发现你栈顶比你此时要检查的序列的元素大的时候,肯定是错误的因为我们压栈是按顺序,出栈是根据所给的序列,正常情况下不会出现序列中对应的元素大于栈顶的情况,比如:
5 6 4 3 7 2 1(正确的)
5 6 4 3 7 1 2(错误的)
因为2不出栈1就没办法先出栈

```c

#define _CRT_SECURE_NO_WARNINGS//为了可以使用scanf
#include <stdio.h>
#include <stdlib.h>

struct stack {
	int* stack;
	int head = 0;//指向栈顶元素的上一个元素
	int p;//记录此时要压栈的元素
}Stack;

void Init(int MAX) {
	Stack.p = 1;
	Stack.head = 0;
	Stack.stack = (int*)calloc(MAX, sizeof(int));
}
void Push() {
	//printf("Stack.p = %d\n", Stack.p);
	Stack.stack[Stack.head++] = Stack.p++;
}
int Pop() {
	return Stack.stack[--Stack.head];
}
int main() {
	int MAX, N, K;//N是要检查的每个序列里元素的个数
	scanf("%d %d %d/n", &MAX, &N, &K);
	int* a = (int*)calloc(N, sizeof(int));
	int* check = (int*)calloc(N, sizeof(int));//check yes 1 or not 0

	for (int index = 0;index < K;index++) {//每次输入一个检查一个
		for (int i = 0;i < N;i++) {
			scanf("%d", &a[i]);
		}//接受输入的N个检查的数
		Init(MAX);//创建一个栈
		//Push(1);//第一个进栈的一定是1

		for (int i = 0;i < N;i++) {//对于输入的序列一个元素进行检查
			int is_break = 0;
			while (a[i] > Stack.stack[Stack.head - 1] || Stack.head == 0) {//栈顶元素小于此时要检查的元素 不断的入栈	
				//printf("Max %d\n", Stack.head);
				if (Stack.head >= MAX) {//已近满了但还要压  说明这个序列不合适
					check[index] = 0;
					is_break = 1;
					break;
				}
				else {
					Push();
				}
			}
			if (is_break)
				break;//跳出这个序列的检查
			if (a[i] == Stack.stack[Stack.head - 1]) {//等于检查元素
				Pop();
				if (i == N - 1) {//这个序列的最后一个元素也满足
					check[index] = 1;
				}
				continue;
			}
			else {//大于检擦元素
				check[index] = 0;
				break;
			}


		}//结束对一个序列中N个值检测
	}//结束对K个序列的检测
	for (int i = 0;i < K;i++) {
		//printf("check  %d\n", check[i]);
		if (check[i] == 1)
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值