nefu 1624 栈-程序员输入问题
把字符串从前往后遍历,是#就退栈,是@就清栈,其他的直接入栈
然后把这个栈弄到另外一个栈里,再依次输出另外一个栈的栈顶即可
#include <bits/stdc++.h>
using namespace std;
stack<char>s1,s2;
int main()
{
string a;
getline(cin,a);
for(int i=0;i<a.length();i++)
{
if(a[i]=='@')
{while(!s1.empty())s1.pop();}
else if(a[i]=='#')s1.pop();
else s1.push(a[i]);
}
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
while(!s2.empty())
{
printf("%c",s2.top());
s2.pop();
}
return 0;
}
nefu 1627 栈-溶液模拟器
#include <bits/stdc++.h>
using namespace std;
typedef struct
{
int v;
double c;
}liquid;
stack<liquid>vis;
int main()
{
int n,v0,v1,v2,v3;
double c0,c1,c2,c3;
string str;
ios::sync_with_stdio(false);
cin>>v0>>c0>>n;
vis.push({v0,c0});
while(n--)
{
cin>>str;
if(str=="P")
{
liquid tmp=vis.top();
v1=tmp.v;c1=tmp.c;
cin>>v2>>c2;
v3=v1+v2;
c3=(v1*c1+v2*c2)/v3;
printf("%d %.5lf\n",v3,c3);
vis.push({v3,c3});
}
if(str=="Z")
{
if(vis.size()==1)
printf("%d %.5lf\n",v0,c0);
if(vis.size()>1)
{
vis.pop();
liquid tmp=vis.top();
printf("%d %.5lf\n",tmp.v,tmp.c);
}
}
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
stack<int>vis;
int main()
{
int n,x,i=1;
scanf("%d",&n);
while(n--)
{
scanf("%d",&x);
if(i>x)
vis.pop();
if(i<=x)
{
for(;i<=x;i++)
{
vis.push(i);
printf("A");
}
}
printf("B");
}
printf("\n");
return 0;
}
nefu 1629 栈-洗盘子
#include <bits/stdc++.h>
using namespace std;
stack<int>s1,s2,s3;
int main()
{
int n,x,flag;
cin>>n;
for(int i=n;i>=1;i--)//注意初始入栈是n到1不是1到n
s1.push(i);
while(!(s1.empty()&&s2.empty()))
{
cin>>flag>>x;
if(flag==1)
{
while(x--&&!s1.empty())
{s2.push(s1.top());s1.pop();}
}
if(flag==2)
{
while(x--&&!s2.empty())
{s3.push(s2.top());s2.pop();}
}
}
while(!s3.empty())
{printf("%d\n",s3.top());s3.pop();}
return 0;
}
nefu 1630 栈-括号匹配
#include <bits/stdc++.h>
using namespace std;
stack<char>s;
int main()
{
string a;
cin>>a;
for(int i=0;i<a.length();i++)
{
if(s.empty()){s.push(a[i]);continue;}
if(s.top()=='('&&a[i]==')')s.pop();
else if(s.top()=='['&&a[i]==']')s.pop();
else s.push(a[i]);
}
if(s.empty())printf("OK\n");
else printf("Wrong\n");
return 0;
}
先介绍一下string和isdigit,还是很好用的。
string str; 定义变量
cin>>str; 依次读入字符,读入空格或者回车则停止读入。这题字符串没有空格,所以就相当于%s输入了。
str.length()计算字符串s的长度,比如"12345"长度是5。
isdigit(char str)判断一个字符str是否为数字,当str为数字0-9返回非零值,不为数字则返回零。
注释详见代码
#include <bits/stdc++.h>
#define mod 10000
using namespace std;
stack<int>vis;
int main()
{
long long ans=0; //存储答案
long long tmp=0; //存储读入数字的缓冲区
int flag=0; //标记乘号
string str;
cin>>str; //依次读入字符,读入空格或者回车则停止读入。这题字符串没有空格,所以就相当于%s输入了。
str=str+'+'; //在表达式末尾再添加一个加号
for (int i=0;i<=str.length()-1;i++) //在表达式的每一位中
{
if(isdigit(str[i]))//如果是s[i]是数字则累加入缓冲区中,得到数字tmp
tmp=tmp*10+(str[i]-'0');
if(flag&&!isdigit(str[i])) //如果缓冲区数字已读完且数字前是乘号
{
tmp=tmp%mod*vis.top();//累乘栈顶元素,得到数字tmp
vis.pop(); //弹出栈顶元素
flag=0; //取消乘号标记
}
if(str[i]=='+')//如果是加号则将缓冲区数字压入栈中
{
vis.push(tmp%mod);
tmp=0;
}
if(str[i]=='*')//如果是乘号则将缓冲区数字压入栈中并标记乘号
{
flag=1;
vis.push(tmp%mod);
tmp=0;
}
}
while(!vis.empty())
{
ans=ans+vis.top();//累加栈内元素
vis.pop();
}
printf("%d\n",ans%mod);
return 0;
}
今天这六道题就到此为止了。
栈确实还挺好用的,明天学习队列。