链接:http://dsalgo.openjudge.cn/stackqueue/1/
来源:数据结构与算法MOOC
1:用队列对扑克牌排序
#include<bits/stdc++.h>
using namespace std;
queue<string>qnum[10];
queue<string>q[5];
int main(){
int n;
cin>>n;
string str[1000];
for(int i=1;i<=n;i++)
cin>>str[i];
for(int i=1;i<=n;i++){
for(int j=1;j<=9;j++){
if(str[i][1]-'0'==j)
qnum[j].push(str[i]);
}
}
int k=0;
for(int i=1;i<=9;i++){
cout<<"Queue"<<i<<":";
if(qnum[i].empty()) cout<<endl;
while(!qnum[i].empty()){
str[++k]=qnum[i].front();
cout<<qnum[i].front();
if(qnum[i].size()==1) cout<<endl;
else cout<<" ";
qnum[i].pop();
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=4;j++){
if(str[i][0]==(char)(j-1+'A'))
q[j].push(str[i]);
}
}
k=0;
for(int i=1;i<=4;i++){
cout<<"Queue"<<(char)(i-1+'A')<<":";
if(q[i].empty()) cout<<endl;
while(!q[i].empty()){
str[++k]=q[i].front();
cout<<q[i].front();
if(q[i].size()==1) cout<<endl;
else cout<<" ";
q[i].pop();
}
}
for(int i=1;i<n;i++)
cout<<str[i]<<" ";
cout<<str[n]<<endl;
return 0;
}
2:栈的基本操作
注意点:出现栈空的情况依然要输入。最后在输出error
#include<bits/stdc++.h>
using namespace std;
const int Max_n=300;
int a[Max_n];
int main(){
int T;
cin>>T;
while(T--){
stack<int>s;
bool flag=true;
int n;
cin>>n;
while(n--){
string str;
cin>>str;
if(str=="push"){
int val;
cin>>val;
s.push(val);
}else{
if(s.empty()){
flag=false;
}
else{
s.pop();
}
}
}
if(flag){
int cnt=0;
while(!s.empty()){
a[++cnt]=s.top();
s.pop();
}
for(int i=cnt;i>=1;i--){
cout<<a[i];
if(i==1) cout<<endl;
else cout<<" ";
}
}else cout<<"error"<<endl;
}
return 0;
}
3:stack or queue
直接判断这组数据是不是按照栈的方式出入即可。
#include<bits/stdc++.h>
using namespace std;
const int Max_n=300;
int a[Max_n];
int main(){
int T;
scanf("%d",&T);
while(T--){
stack<int>s;
int n;
scanf("%d",&n);
bool flag=true;
int flag1;
while(n--){
int type,val;
scanf("%d%d",&type,&val);
if(type==1){
s.push(val);
flag1=val;
}else{
if(flag1!=val){
flag=false;
s.pop();
if(s.size())
flag1=s.top();
}else{
s.pop();
if(s.size())
flag1=s.top();
}
}
}
if(flag) printf("Stack\n");
else printf("Queue\n");
}
return 0;
}
4:双端队列
#include<bits/stdc++.h>
using namespace std;
const int Max_n=1e6+10;
int a[Max_n];
bool flag[Max_n];
deque<int>d;
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int type,val;
scanf("%d%d",&type,&val);
if(type==1)
d.push_back(val);
else{
if(val) d.pop_back();
else d.pop_front();
}
}
if(!d.size()) printf("NULL\n");
while(d.size()){
printf("%d%c",d.front(),d.size()==1?'\n':' ');
d.pop_front();
}
}
return 0;
}
5:等价表达式
方法一:多项式相减,判断最终结果是零还是非零
方法二:将中缀表达式转换成后缀表达式,然后各自计算结果,最后判断两个结果是否相等
//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stack>
#include<cstring>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int Max_n=1e6+10;
char a[Max_n],b[Max_n],str[Max_n];
void change(char a[]){
stack<char>s;
int cnt=0;
int n=strlen(a);
for(int i=0;i<n;i++){
if(a[i]=='+'||a[i]=='-'){
while(!s.empty()&&s.top()!='('){
str[cnt++]=s.top();
s.pop();
}
s.push(a[i]);
}else if(a[i]=='*'){
while(!s.empty()&&s.top()!='('&&s.top()=='*'){
str[cnt++]=s.top();
s.pop();
}
s.push(a[i]);
}else if(a[i]=='('){
s.push(a[i]);
}else if(a[i]==')'){
while(s.top()!='('){
str[cnt++]=s.top();
s.pop();
}
s.pop();
}else if(a[i]=='\t'||a[i]==' '){
continue;
}else{
str[cnt++]=a[i];
}
}
while(!s.empty()){
str[cnt++]=s.top();
s.pop();
}
}
void init(){
for(int i=0;i<=Max_n;i++)
str[i]='\0';
}
int cal(char val[]){
stack<ll>s;
int lenval=strlen(val);
for(int i=0;i<lenval;i++){
ll temp;
if(val[i]=='+'){
temp=s.top();s.pop();
temp+=s.top();s.pop();
s.push(temp);
}else if(val[i]=='-'){
temp=s.top();s.pop();
temp-=s.top();s.pop();
s.push(-temp);
}else if(val[i]=='*'){
temp=s.top();s.pop();
temp*=s.top();s.pop();
s.push(temp);
}else{
if(val[i]<='9'&&val[i]>='0') s.push(val[i]-'0');
else s.push((int)val[i]);
//if(val[i]<='z'&&val[i]>='a') s.push(val[i]-'a'+1);
//if(val[i]<='Z'&&val[i]>='A') s.push(val[i]-'A'+1);
}
}
ll ans=s.top();s.pop();
return ans;
}
int main(){
int n;
scanf("%d",&n);getchar();
while(n--){
cin.getline(a,Max_n-1,'\n');
cin.getline(b,Max_n-1,'\n');
init();change(a);
char stra[Max_n],strb[Max_n];
int len=strlen(str);
for(int i=0;i<=len;i++)
stra[i]=str[i];
init();change(b);
len=strlen(str);
for(int i=0;i<=len;i++)
strb[i]=str[i];
//puts(stra);puts(strb);
//printf("%d %d\n",cal(stra),cal(strb));
if(cal(stra)==cal(strb)) printf("YES\n");
else printf("NO\n");
}
return 0;
}
8:抓住那头牛
bfs,将三种可能的情况都放进队列中,找到最小的step即可。
//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stack>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int Max_n=1e6+10;
const int Max_m=100000;
bool vis[Max_n];
int n,k;
struct Node{
int val,step;
Node(){}
Node(int val,int step):val(val),step(step){};
}node[Max_n];
queue<Node>q;
void bfs(int val,int step){
vis[val]=true;q.push(Node(val,step));
while(!q.empty()){
Node node=q.front();q.pop();
//cout<<node.val<<" "<<node.step<<endl;
if(node.val==k){
printf("%d\n",node.step);
return;
}
if(!vis[node.val+1]&&node.val+1<=Max_m){
vis[node.val+1]=true;
q.push(Node(node.val+1,node.step+1));
}
if(!vis[node.val-1]&&node.val-1>=0){
vis[node.val-1]=true;
q.push(Node(node.val-1,node.step+1));
}
if(!vis[node.val*2]&&node.val*2<=Max_m){
vis[node.val*2]=true;
q.push(Node(node.val*2,node.step+1));
}
}
}
int main(){
scanf("%d%d",&n,&k);
memset(vis,false,sizeof(vis));
bfs(n,0);
return 0;
}
9:发型糟糕的一天
将每头牛能看到多少个转化为每头牛能够被看到多少次。
//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stack>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int Max_n=8e4+10;
stack<int>s;
int main(){
int n;
scanf("%d",&n);
ll ans=0;
while(n--){
int val;
scanf("%d",&val);
///将前面看不到这头牛的删除
while(!s.empty()&&val>=s.top()) s.pop();
ans+=s.size();
s.push(val);
}
printf("%lld\n",ans);
return 0;
}
10:括号画家
遇到匹配的就弹出
#include<bits/stdc++.h>
using namespace std;
const int Max_n=1e4+10;
char a[Max_n];
stack<char>s;
int main(){
scanf("%s",a);
int n=strlen(a);
for(int i=0;i<n;i++){
if(s.empty()){
s.push(a[i]);
continue;
}
if(a[i]=='}'&&s.top()=='{')
s.pop();
else if(a[i]==']'&&s.top()=='[')
s.pop();
else if(a[i]==')'&&s.top()=='(')
s.pop();
else
s.push(a[i]);
}
if(s.empty()) printf("Yes\n");
else printf("No\n");
return 0;
}
11:机器翻译
不重复的先加进去k个,用vis标记这个数是否在队列中,按照题意更新队列。
#include<bits/stdc++.h>
using namespace std;
const int Max_n=1e6+10;
int a[Max_n];
bool flag[Max_n];
queue<int>q;
int main(){
int m,n;
scanf("%d%d",&m,&n);
memset(flag,false,sizeof(flag));
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int cnt=0;
for(int i=1;i<=n;i++){
if(flag[a[i]]) continue;
cnt++;
if(q.size()==m){
flag[q.front()]=false;
q.pop();
}
q.push(a[i]);
flag[a[i]]=true;
}
printf("%d\n",cnt);
return 0;
}