栈与队列均没有 begin,end等操作
栈与模拟栈
栈(先进后出)
//栈
#include<iostream>
#include<stack>
using namespace std;
int main()
{
stack<int> stk;
stk.push(9);
stk.push(6);
stk.push(3);//向栈中插入元素
stk.pop(); //弹出栈顶元素,类似于删除
cout<<stk.top()<<endl; //返回值为栈顶元素
cout<<stk.empty(); //判断是否为空
return 0;
}
使用数组模拟栈
//通过数组模拟栈我们可以直接访问到栈中的元素
例题 https://www.acwing.com/problem/content/description/830/
#include<iostream>
#include<string>
using namespace std;
const int N=100010;
int stk[N];
int tt;//栈顶,数组的尾部
int main()
{
int n;
cin>>n;
while(n--)
{
string ss;
int x;
cin>>ss;
if(ss=="push")//插入
{
cin>>x;
stk[++tt]=x;
}else if(ss=="pop")//弹出
{
tt--;
}else if(ss=="empty")//是否为空
{
if(tt>0) cout<<"NO"<<endl;
else cout<<"YEs"<<endl;
}else if(ss=="query")//栈顶
{
cout<<stk[tt]<<endl;
}
}
return 0;
}
单调栈
https://www.acwing.com/problem/content/description/832/
#include<iostream>
#include<stack>
using namespace std;
const int N=100010;
int stk[N];
int tt;
int main()
{
int n;
int x;
// stack<int> stk;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
while(tt&&stk[tt]>=x) tt--;//数据结构中的stack无法直接指向元素
if(tt) cout<<stk[tt]<<" ";
else cout<<-1<<" ";
stk[++tt]=x;
}
return 0;
}
队列与模拟队列
队列(先进先出)
#include<iostream>
#include<queue>
using namespace std;
int main()
{
queue<int> q;
q.push(9);
q.push(7);
q.push(6);
q.push(3);
cout<<q.back()<<endl;//队尾
cout<<q.front()<<endl;//队头
q.emplace();//判断是否为空
q.pop();//删除队头元素
cout<<q.front()<<endl;
return 0;
}
模拟队列
https://www.acwing.com/problem/content/831/
#include<iostream>
#include<string>
using namespace std;
const int N=100010;
int que[N];
int hh,tt;
//hh 表示队头
//tt 表示队尾
int main()
{
int n;
cin>>n;
hh=1;
while(n--)
{
string ss;
int x;
cin>>ss;
if(ss=="push")//插入元素
{
cin>>x;
que[++tt]=x;
}else if(ss=="pop")//删除元素
{
if(que[hh]==0) continue;
hh++;
}else if(ss=="empty")//判断队列是否为空
{
if(tt>=hh) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}else
{
cout<<que[hh]<<endl;
}
}
return 0;
}