基础数据结构(线性表)
2 栈(后进先出)
栈是只在一端进行插入和删除操作的线性表。插入称为入栈,删除称为出栈。
// 使用数组模拟栈
// tt表示栈顶的上一个位置
int stk[N], tt = 0;
// 向栈顶插入一个数
stk[tt++] = x;
// 从栈顶弹出一个数
tt--;
// 栈顶的值
int t = tt;
stk[--t];
// 判断栈不为空
if (tt)
2.1 例题1 火车进站
#include <iostream>
#include <vector>
using namespace std;
const int N = 25;
int stk[N], n, tt;
int cnt = 0; // 记录方案数
vector<int> ans; // 火车进栈出栈之后却未出站
void dfs(int u) {
if(cnt >= 20) return;
if(u > n) { // 所有火车均已进站
cnt ++;
for(auto x : ans) cout << x;
for(int i = tt - 1; i >= 0; i--) cout << stk[i];
cout << endl;
return;
}
if(tt) { // 栈未空
ans.push_back(stk[--tt]); // 栈顶火车出栈
dfs(u);
stk[tt++] = ans.back();
ans.pop_back();
}
// 右侧火车进栈
stk[tt++] = u;
dfs(u + 1);
tt--;
}
int main() {
cin >> n;
dfs(1);
return 0;
}
2.2 例题2 括号匹配
#include <iostream>
#include <string>
using namespace std;
int lv(char ch)
{
if(ch=='{'||ch=='}')return 4;
if(ch=='['||ch==']')return 3;
if(ch=='('||ch==')')return 2;
if(ch=='<'||ch=='>')return 1;
}
char stk[110];
int tt, n;
int main() {
cin>>n;
while(n--){
string s;
cin>>s;
stk[0] = 5;
tt = 0;
for(int i = 0; i < s.size(); i++) {
if(s[i]=='<'||s[i]=='('||s[i]=='['||s[i]=='{') {
if(lv(s[i]) <= stk[tt])
stk[++tt] = lv(s[i]);
} else {
if(tt > 0 && lv(s[i]) == stk[tt])
tt--;
else {
tt = -1;
break;
}
}
}
if(tt == 0) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}