算法与数据结构实验题 3.1 stack

算法与数据结构实验题 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;        
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值