栈的用法详解
栈的用法详解
栈是一种先入后出(FILO)的数据结构。
利用数组模拟栈
#include <bits/stdc++.h>
using namespace std;
int stk[10005];
int end = 0;
void pop()
{
stk[end] = 0;
end--;
}
void push(int t)
{
stk[end] = t;
end++;
}
int main()
{
for (int i = 0; i < 10005; i++)
{
stk[i] = 0;
}
while (cin.eof() == false)
{
char ch;
cin >> ch;
if (ch == 'P')
{
int t;
cin >> t;
push(t);
}
if (ch == 'O')
{
pop();
}
if (ch == 'Q')
{
for (int i = 0; i < end; i++)
cout <<stk[i]<<" ";
cout<<endl;
}
}
return 0;
}
代码中,利用变量end
维护栈底,正常情况下不能通过直接访问数组来获取栈中内容,但是这是数组,所以……
STL stack
#include <bits/stdc++.h>
using namespace std;
stack<int> st;
int main()
{
for (int i = 0; i < 10; i++)
{
st.push(i);
}
cout << st.top() << endl;
cout << st.size() << endl;
cout << st.empty() << endl;
st.pop();
cout << st.size() << endl;
cout << st.top() << endl;
return 0;
}
经典的STL函数应用,输出为
9
10
0
9
8
其中可以发现st.empty()
返回的是empty()?true:false
,所以在实际应用上要记得改成!st.empty()
。
典型例题:洛谷P1427 小鱼的数字游戏
题目描述
小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字 \(a_i\)(长度不一定,以 \(0\) 结束),记住了然后反着念出来(表示结束的数字 \(0\) 就不要念出来了)。这对小鱼的那点记忆力来说实在是太难了,你也不想想小鱼的整个脑袋才多大,其中一部分还是好吃的肉!所以请你帮小鱼编程解决这个问题。
输入格式
一行内输入一串整数,以 \(0\) 结束,以空格间隔。
输出格式
一行内倒着输出这一串整数,以空格间隔。
样例 #1
样例输入 #1
3 65 23 5 34 1 30 0
样例输出 #1
30 1 34 5 23 65 3
提示
数据规模与约定
对于 \(100\%\) 的数据,保证 \(0 \leq a_i \leq 2^{31} - 1\),数字个数不超过 \(100\)。
#include <bits/stdc++.h>
using namespace std;
int stk[10005];
int end = 0;
void pop()
{
cout << stk[end] << " ";
stk[end] = 0;
end--;
}
void push(int t)
{
stk[end] = t;
end++;
}
int main()
{
/*
int n;
cin>>n;
for (int i = 0; i <n;i++){
cin>>stk[i];
}
reverse(stk,stk+n-1);
for(int i = 0; i < n; i++){
cout<<stk[i];
}
*/
// int n;
// cin >> n;
for (int i = 0; i < 10005; i++)
{
int t;
cin >> t;
if (t == 0)
break;
push(t);
}
for (int i = 0; i < end; i++)
{
pop();
}
return 0;
}
// stl_main
int main_stl()
{
stack<int> st;
for (int i = 0; i < n; i++)
{
int t;
cin >> t;
if (t == 0)
break;
st.push(t);
}
while (!st.empty())
{
cout << st.top() < " ";
st.pop();
}
return 0;
}