一、栈
1,概念理解
形象地说,栈就好比一个桶,可以往里面方东西,但只能一层一层放。也可以拿走桶里的东西,但只能先拿走最上面的,才能拿到下面的东西。
元素入栈(如下)
元素出栈(如下)
抽象地说,栈就是一种元素先进后出的数据结构。
2,操作
定义结构体,。
const int N=1e5+7;//假设数据量不会超过N
struct stack{
int arr[N],top;
stack(){
top=-1;//初始化栈为空
}
};
判空
bool empty(stack& s)
{
return s.top==-1?true:false;//如果栈顶为-1,表示现在栈内无元素
}
入栈
void push(stack &s,int d)
{
s.arr[++s.top]=d;//先将栈顶+1,再放入元素
}
出栈
void pop(stack &s)
{
if(!s.empty())s.top--;//如果栈非空,那么栈顶-1;
//虽然原数据还在数组里,但是无论是访问还是增加元素都不会受它影响
}
取得栈顶元素
int top(stack &)
{
if(!s.empty())return s.arr[s.top];
return -1;//假设-1为非法数据
}
返回大小
int size(stack &s)
{
return s.top+1;//此处栈下标从0开始
}
3STL模板库
在C++中提供了标准模板库,可以直接使用栈模板,只需增加头文件,所以以上代码不需要我们书写,只需理解内部大概的流程和结构及实现过程
#include<iostream>
#include<stack>
using namespace std;
int main()
{
stack<int>st;
st.empty();//判空,若空返回真
st.pop();//弹出元素
st.push(5);//增加元素
st.size();//返回大小
st.top();//返回栈顶元素
}
4,例题演示
思路:遍历字符串,若遇到‘(’,则入栈,否则出栈。若无法出栈或最后栈的大小大于0,说明不匹配,用flag记录一下。
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main()
{
stack<char>st;
string s;
cin>>s;
bool flag=true;//假设字符串合法
for(int i=0;i<s.length()&&flag;i++)
{
if(s[i]=='@')break;
if(s[i]=='(')st.push('(');
if(s[i]==')')
{
if(!st.empty())st.pop();
else flag=false;
}
}
if(st.size()>0)flag=false;
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
二、队列
1,概念理解
形象地说,好比生活中大家排队买东西,先到的先买,先到先得。
入队
出队
抽象地说,队列就是一种元素先进先出的数据结构。
2,操作
定义结构体
const int N=1e5+7;
struct queue
{
int arr[N];//假设数据量不超过N
int l,r;
queue()
{
l=0,r=-1;//l代表队头下标,r代表队尾下标
}
};
判空
bool empty(queue &q)
{
return q.l>q.r;
}
入队
void push(queue &q,int d)
{
q.arr[++q.r]=d;
}
出队
void pop(queue &q)
{
if(!empty(q))q.l++;
}
取得队头元素
int front(queue &q)
{
if(!empty(q))return q.arr[q.l];
else return -1;
}
取得队尾元素
int back(queue &q)
{
if(!empty(q))return q.arr[q.r];
else return -1;
}
返回大小
int size(queue &q)
{
return q.r-q.l+1;
}
3STL模板库
#include<iostream>
using namespace std;
#include<queue>
int main()
{
queue<int>que;
que.back();
que.empty();
que.front();
que.pop();
que.push(1);
que.size();
}
4,例题演示
思路:用队列直接模拟
#include<iostream>
using namespace std;
#include<queue>
int main()
{
queue<int>que;
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
que.push(i);
}
int num=0;
while(que.size())
{
num++;
if(num==m)
{
cout<<que.front()<<' ';
num=0;
que.pop();
}
else
{
que.push(que.front());
que.pop();
}
}
}