问题描述
一天,小 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
思路
用数组模拟栈。应注意非法忽略操作
code
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 #define MAXN 1001 6 7 int arr[MAXN]={0}; 8 int len=0; 9 10 void in() 11 { 12 int num; 13 scanf("%d",&num); 14 getchar(); 15 arr[len++]=num; 16 } 17 18 void pop() 19 { 20 if(len>0) 21 len--; 22 } 23 24 void asub() 25 { 26 if(len>=2) 27 { 28 int num = arr[len-2]-arr[len-1]; 29 arr[len-2] = num>0 ? num : -num; 30 len--; 31 } 32 } 33 34 void copy() 35 { 36 if(len>0) 37 { 38 arr[len] = arr[len-1]; 39 len++; 40 } 41 } 42 43 int getSum() 44 { 45 int i,sum=0; 46 for(i=0;i<len;i++) 47 { 48 sum+=arr[i]; 49 } 50 return sum; 51 } 52 53 //void _disAll() 54 //{ 55 // int i; 56 // for(i=0;i<len;i++) 57 // printf("%d ",arr[i]); 58 // printf(" "); 59 //} 60 61 int main() 62 { 63 int i=0; 64 int opnum=0; 65 char op[10]={0}; 66 67 scanf("%d",&opnum); 68 getchar(); 69 for(i=0;i<opnum;i++) 70 { 71 scanf("%s",op); 72 if(strcmp(op,"IN")==0) 73 { 74 in(); 75 } 76 else if(strcmp(op,"POP")==0) 77 { 78 pop(); 79 } 80 else if(strcmp(op,"ASUB")==0) 81 { 82 asub(); 83 } 84 else if(strcmp(op,"COPY")==0) 85 { 86 copy(); 87 } 88 //else printf("OP ERROR"); 89 // _disAll(); 90 } 91 printf("%d ",getSum()); 92 93 return 0; 94 }