算法笔记 第7章 提高篇(1)--数据结构专题(1) 学习笔记

7.1栈的应用

栈:后进先出,可以理解为一个箱子,而箱子的容量仅供一本书放入或拿出。每次可以把一本书放在箱子的最上方,也可以把箱子最上方的书拿出。

栈顶指针:始终指向栈的最上方元素的一个标记,栈中没有元素(即栈空)时令TOP为-1.

栈的常见操作示范实现,使用数组st[]来实现栈:

(1)清空(clear):

栈的清空操作将栈顶指针TOP置为-1,表示栈中没有元素。

void clear(){

  TOP = -1;

}

(2)获取栈内元素个数(size)

栈内元素个数为TOP+1

int size(){

  return TOP + 1;

}

(3)判空(empty)

当TOP == -1时,栈为空,返回true;否则,返回false

bool empty(){

  if(TOP == -1) return true;

  else return false;

}

(4) 进栈(push)

void push(int x){

  st[++TOP] = x;

}

(5)出栈(pop)

void pop(){

  TOP--;

}

(6)取栈顶元素(top)

int top(){

  return st[TOP];

}

 

在使用pop()函数和top()函数之前必须先使用empty()函数判断栈是否为空。

可以使用STL中的stack容器,STL中没有实现栈的清空,如果需要实现栈的清空,可以用一个while循环反复pop出元素直到栈空。

while(!st.empty()){

  st.pop();

}

PAT 1051 Pop Sequence (25分)

 

Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of the stack. For example, if M is 5 and N is 7, we can obtain 1, 2, 3, 4, 5, 6, 7 from the stack, but not 3, 2, 1, 7, 5, 6, 4.

Input Specification:

Each input file contains one test case. For each case, the first line contains 3 numbers (all no more than 1000): M (the maximum capacity of the stack), N (the length of push sequence), and K (the number of pop sequences to be checked). Then K lines follow, each contains a pop sequence of N numbers. All the numbers in a line are separated by a space.

Output Specification:

For each pop sequence, print in one line "YES" if it is indeed a possible pop sequence of the stack, or "NO" if not.

Sample Input:

5 7 5
1 2 3 4 5 6 7
3 2 1 7 5 6 4
7 6 5 4 3 2 1
5 6 4 3 7 2 1
1 7 6 5 4 3 2

Sample Output:

YES
NO
NO
YES
NO
#include
#include
using namespace std;
const int maxn = 1010;
int arr[maxn]; //保存出栈顺序 
stack<int> st; //入栈 
int main(){
    int m,n,T;
    scanf("%d%d%d",&m,&n,&T);
    while(T--){
        while(!st.empty()){
            st.pop();
        }
        for(int i=1;i<=n;i++){
            scanf("%d",&arr[i]);
        }
        int current = 1;
        bool flag = true;
        for(int i=1;i<=n;i++){
            st.push(i);
            if(st.size()>m){
                flag = false;
                break;
            }
            while(!st.empty() && arr[current] == st.top()){
                st.pop();
                current++;
            }
        }
        if(st.empty() == true && flag == true){
            printf("YES\n");
        }else{
            printf("NO\n");
        }
    }
    return 0;
}

 

 

你可能感兴趣的:(算法笔记 第7章 提高篇(1)--数据结构专题(1) 学习笔记)