PTA-——模拟进出栈

PTA

02-线性结构4 Pop Sequence

方法一:

 1 #include<stdio.h>
 2 #define MAXSIZE 1000
 3
 4 typedef struct{
 5     int data[MAXSIZE];
 6     int top;
 7 }SqStack;
 8
 9 int InitStack(SqStack *s){
10     s->top=-1;
11     return 0;
12 }
13
14 int Push(SqStack *s,int e){
15     if(s->top==MAXSIZE) return 1;
16     s->top++;
17     s->data[s->top]=e;
18     return 0;
19 }
20
21 int Pop(SqStack *s){
22     int e;
23     if(s->top==-1) return 1;
24     e = s->data[s->top];
25     s->top--;
26     return e;
27 }
28
29 int main(){
30     int m,n,k,i,h;
31     SqStack s,t;
32     scanf("%d%d%d",&m,&n,&k);
33     while(k--){
34         InitStack(&s);
35         InitStack(&t);
36         for(i=n-1;i>=0;i--){
37             scanf("%d",&(t.data[i]));
38         }
39         t.top=n-1;
40         i=0;
41         while(i<=n){
42             if(s.data[s.top]==t.data[t.top]&&s.top!=-1){
43                 Pop(&s);
44                 Pop(&t);
45             }else if(s.top<m-1 && i<n){
46                 i++;
47                 Push(&s,i);
48             }else{
49                 break;
50             }
51         }
52         if(s.top==-1 && t.top==-1){
53             printf("YES\n");
54         }else{
55             printf("NO\n");
56         }
57     }
58     return 0;
59 }

分析:

1、自定义栈

2、通过两个栈模拟进出

方法二:

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<vector>
 4 #include<stack>
 5 using namespace std;
 6
 7 int M,N,K;
 8
 9 int Check(vector<int> &v) {
10     int i=0;
11     int num=1;
12     int cap=M+1;
13     stack<int> sta;
14     sta.push(0);
15     while(i<N) {
16         while(v[i]>sta.top()&&sta.size()<cap)
17             sta.push(num++);
18         if(v[i++]==sta.top())
19             sta.pop();
20         else
21             return 0;
22     }
23     return 1;
24 }
25
26 int main() {
27     vector<int> vec(N,0);
28     scanf("%d%d%d",&M,&N,&K);
29     for(int i=0; i<K; i++) {
30         for(int j=0; j<N; j++) {
31             int number;
32             scanf("%d",&number);
33             vec.push_back(number);
34         }
35         if(Check(vec)) printf("YES\n");
36         else printf("NO\n");
37         vec.clear();
38     }
39     return 0;
40 }

分析:

1、利用c++容器vector和stack模拟

原文地址:https://www.cnblogs.com/cxc1357/p/10807843.html

时间: 2024-10-26 07:16:23

PTA-——模拟进出栈的相关文章

【Weiss】【第03章】练习3.21:单数组模拟双栈

[练习3.21] 编写仅用一个数组而实现两个栈的例程.除非数组的每一个单元都被使用,否则栈例程不能有溢出声明. Answer: 很简单,一个栈从数组头起,一个栈从数组尾起,分别保留左右栈头索引. 如left=5则表示array[0]~array[4]为左栈元素,right=7则表示array[8]~array[size-1]为右栈元素. 当左右索引交叉时(left=right+1),0~left-1为左栈,left~size-1为右栈,刚好用完每一个单元. 实现代码: 1 //练习3.21新增,

两个栈模拟一个队列和两个队列模拟一个栈

此为网易的一道笔试题.到时候秀逗,不知所云.后来研究之后记录下,以备以后经常翻阅. 栈:先进后出 push和pop 队列:先进先出 offer和poll (1)两个栈模拟一个队列 即将先进后出实现先进先出.比较容易理解,只要所有数据先往一个栈里push,然后将该栈中的数据依次pop出来再push进第二个队列,则顺序自然颠倒过来了,则每次pop是从第二个队列中取数据. import java.util.*; public class StackQueue{ private Stack<Intege

Python模拟入栈出栈操作

目标: 1.编写菜单,提示用户操作选项(push,pop,view,quit) 2.规则:定义列表,先入栈,后出栈,后入栈,先出栈 1.模拟入栈.出栈操作 >>> list1 = [] >>> list1.append('a') >>> list1 ['a'] >>> list1.append('b') >>> list1 ['a', 'b'] >>> list1.pop() 'b' >>

使用两个队列模拟一个栈

准备笔试,在看相关知识,看到这个问题,如何使用两个队列模拟一个栈,在参考了相关知识下,实现了代码如下: 1 public class Stack<E>{ 2 Queue<E> q1 = null; //队列q1提供压栈功能, 3 Queue<E> q2 = null; //队列q2提供弹栈功能 4 5 public Stack(){ 6 q1 = new LinkedList<E>(); 7 q2 = new LinkedList<E>(); 8

数据结构和算法之栈和队列一:两个栈模拟一个队列以及两个队列模拟一个栈

今天我们需要学习的是关于数据结构里面经常看到的两种结构,栈和队列.可以说我们是一直都在使用栈,比如说在前面递归所使用的的系统的栈,以及在链表倒序输出时介绍的自定义栈类Stack和使用系统的栈进行递归.那么,在这里我们就讲述一下这两个比较具有特色的或者说关系比较紧密的数据结构之间的互相实现问题. 一:两个栈模拟实现一个队列: 栈的特点是先进后出,然而队列的特点是先进先出. public class Queen(Stack s1,Stack s2){ //实现插入的方法 public void ad

Codeforces 982 B. Bus of Characters(模拟一个栈)

解题思路: 排序之后模拟一个栈(也可以用真的栈),时间复杂度o(n). 代码: #include <bits/stdc++.h> using namespace std; typedef long long ll; struct node{ int val;int idx; }w[200010]; bool cmp(node x, node y){ return x.val < y.val; } char a[400010]; stack <node> s; int main

剑指offer:两个队列模拟一个栈

题目描述用两个队列来实现一个栈,完成栈的Push和Pop操作. 队列中的元素为int类型. 实现方式其实和两个栈模拟一个队列相似,但是区别在于这两个队列的作用和那两个栈的作用不一样. class Solution: """ 用两个队列模拟一个栈,如果两个队列的容量分别为M和N,其中M > N,那么模拟得到的栈的容量是N+1 因为假设先把queue1塞进N+2个,此时将元素出栈,则需要先将queue1的N+1个元素出队后压入queue2, 由于queue2的容量只有N,入

两个队列模拟一个栈

#include <iostream> #include <assert.h> #include <queue> using namespace std; /*两个队列模拟一个堆栈*/ /*队列A.B 入栈:将元素依次压入到非空的队列,第一个元素压倒对列A 出栈:把队列A的前n-1个元素倒到队列B,把第n个元素去掉.此时数据在B中,下次操作,则对B操作. 栈顶:把队列A的前n-1个元素倒到队列B,把第n个元素作为栈顶*/ template <typename T&

模拟算法+栈 HDU 1022

Train Problem I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 30245    Accepted Submission(s): 11434 Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays