数据结构_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

 

思路

  用数组模拟栈。应注意非法忽略操作

 

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("\n");
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\n",getSum());
92     
93     return 0;
94 } 

 

posted @ 2017-10-12 14:15  cbattle  阅读(255)  评论(0编辑  收藏  举报