Algorithm11.3 数据结构 栈
[TOC]
数据结构 线性表 - 栈
1、通过STL库中的stack,直接可以使用的链表
2、通过手写栈
- 利用「顺序表」实现:用数组来模拟容器,用变量来作为栈顶
- 利用「链接表』实现:用链表实现
- 链首做为栈底,链尾做为栈顶:栈顶添加O(n),查看栈顶O(n),栈顶移除O(n)
- 链首做为栈顶,链尾做为栈底:栈顶添加O(1),查看栈顶O(1),栈顶移除O(1)
进出栈顺序问题 - 利用STL库中的栈进行实现
https://www.luogu.com.cn/problem/P4387
题目大意:给定进栈顺序和出栈顺序,根据进栈顺序来比对出栈顺序是否正确
1、push、pop、empty
#include <iostream>
using namespace std;
#define maxn 100010
int t, len, in[maxn], out[maxn], idx_out;
#include <stack>
stack<int> s;
int main() {
scanf("%d", &t);
while (t--) {
// init
idx_out = 1;
scanf("%d", &len);
for (int i = 1; i <= len; ++i) scanf("%d", &in[i]);
for (int i = 1; i <= len; ++i) scanf("%d", &out[i]);
for (int i = 1; i <= len; ++i) {
s.push(in[i]);
while ((s.top()) == out[idx_out]) {s.pop();idx_out++;if (s.empty()) break;}
}
if (!s.empty()) printf("No\n");
else printf("Yes\n");
while (!s.empty()) s.pop();
}
return 0;
}
进出栈顺序问题 - 利用手写栈进行实现
1、数据结构:用一个数组来模拟栈
stk[maxn]
用做存放数据的容器,top
用来做栈的唯一索引。【注意,堆用作存放数据的容器是myheap[maxn]
,size用来做堆的唯一索引。】
2、基本操作:push、pop、empty
// push添加元素
void push(int x) {stk[++top] = x;}
// pop弹出栈顶元素
void pop() {top--;}
// 判断是否为空 => 就看栈顶的索引top的值即可,看索引是否是0,是0的话就代表栈顶
bool empty() {if (!top) return true;return false;}
AC代码
#include <iostream>
using namespace std;
#define maxn 100010
int t, stk[maxn], top, len, in[maxn], out[maxn], idx_out;
void push(int x) {stk[++top] = x;}
void pop() {top--;}
bool empty() { if(!top)return true;return false;}
int main() {
scanf("%d", &t);
while (t--) {
// init
top=0;idx_out=1;
scanf("%d", &len);
for (int i = 1; i <= len; ++i) scanf("%d", &in[i]);
for (int i = 1; i <= len; ++i) scanf("%d", &out[i]);
for (int i = 1; i <= len; ++i) {
push(in[i]);
while (stk[top] == out[idx_out]) {pop();idx_out++;if (empty())break;}
}
if (!empty()) printf("No\n");
else printf("Yes\n");
}
return 0;
}