算法与数据结构实验题 3.1 stack
★实验任务
一天,小 L 发现了一台支持一下操作的机器:
IN x:将整数 x 入栈
POP:将栈顶元素出栈
ASUB:出栈两个数,将两数差的绝对值入栈
COPY:将栈顶元素(如果有的话)复制一份,入栈
现在小 L 想知道经过给定的 n 次操作之后,栈内所有元素之和是多少。
Notice:这台机器会自动忽略不合法的操作。
★数据输入
第一行一个正整数 n,表示有 n 次操作。
接下来有 n 行,每行一个操作。
0<=n<=1000, 0<=x<=1000
★数据输出
输出这台机器在 n 次操作后,栈内所有元素之和。
★样例
输入示例
4
IN 10
IN 11
ASUB
COPY
输出示例
2
思路:
这题是模仿栈的操作,可以用多种方法来实现栈。我采用数组来模拟。
题目的关键在于对不合法操作的理解。我一开始的理解是测试点会出现“POPP”、“P”这样的操作,所以代码只A了一个点2333
不合法操作指的是在不满足操作条件的情况下执行操作。例如,在栈中不足两个数时,输入操作“ASUB”;在栈中没有数时,输入操作“POP”。明白这些后,题目就非常容易了。
附上代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int s[2001];
int main()
{
char m[5];
int i,j=0,k=0,l=0,x,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",m);
if(!strcmp(m,"IN"))
{
cin>>x;
s[j]=x;
j++;
}
else if(!strcmp(m,"POP")&&(j-l>0))
{
j--;
s[j]=0;
}
else if(!strcmp(m,"ASUB")&&(j-l>1))
{
s[j-2]=abs(s[j-1]-s[j-2]);
s[j-1]=0;
j--;
}
else if(!strcmp(m,"COPY")&&(j-l>0))
{
s[j]=s[j-1];
j++;
}
memset(m,'\0',sizeof(m)); //把字符串置空,也可以 bzero(m,sizeof(m)); 然鹅貌似并没有必要233
}
for(i=0;i<j;i++)
{
k=k+s[i];
}
printf("%d",k);
return 0;
}