1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #define Maxlen 100 //定义输入字符的长度
5
6 //顺序栈
7 typedef struct
8 {
9 char data[Maxlen];//存储字符
10 int top;
11 }SeqStack;
12
13 SeqStack* Init()//栈初始化
14 {
15 SeqStack *s;
16 s=(SeqStack *) malloc ( sizeof(SeqStack) );
17 s->top = -1;
18 return s;
19 }
20
21 void Destroy(SeqStack *s)//释放存储空间
22 {
23 free(s);
24 }
25
26 int IsFull(SeqStack *s)//判断为满
27 {
28 return (s->top == Maxlen-1) ? 1:0;
29 }
30
31 int IsEmpty(SeqStack *s)//判断为空
32 {
33 return (s->top == -1) ? 1:0;
34 }
35
36 void Push(SeqStack *s, char e)//入栈
37 {
38 if( IsFull(s) )
39 {
40 printf("栈为满,无法入栈!\n");
41 return;
42 }
43 s->top ++;
44 s->data[ s->top ] = e;
45 }
46
47 int Pop(SeqStack *s)//出栈
48 {
49 char e;
50 if( IsEmpty(s) )
51 {
52 printf("栈为空,没有数据!\n");
53 return NULL;
54 }
55 e = s->data[ s->top ];
56 s->top --;
57 return e;
58 }
59
60
61 //返回字符数组元素的个数
62 int Mystrlen(char *str)
63 {
64 int num = 0;
65 for(;*str!='\0';str++)//当没遇到回车符的时候 字符数目+1
66 num++;
67 return num;
68 }
69
70 int main()
71 {
72 char string[Maxlen];//存储键盘输入的字符串
73 char temp;
74 int n,length,a,b,c,sum,i;//n:总执行次数,a:出S次数,b:出J次数,c:出B次数,sum:总成绩;
75 SeqStack *s;
76 while(1)
77 {
78 printf("input n:");
79 scanf("%d",&n);//输入n
80 if(n==0)break;//当n=0时输入结束
81 sum=0;//总分初始化为0
82 printf("input string:");
83 scanf("%s", string);//输入对手每次出的数据
84 printf("input a b c:");
85 scanf("%d%d%d",&a,&b,&c);//输入a次S,b次J和c次B(a,b,c都是非负并且a+b+c=n)。
86
87 length=Mystrlen(string);//获得输入字符串的长度
88
89
90 s=Init();
91 for(i=0;i<length;i++)Push(s,string[i]);
92
93 while(!IsEmpty(s))
94 {
95 temp = Pop(s);
96 if(temp=='S')//如果当前的字符是S:石头
97 {
98 if(c>0)//如果当前“布”未被用的次数大于0,选择出“布”,可赢 得1分
99 {
100 c--;//“布”可被用的次数-1
101 sum++;//得一分
102 }
103 else if(a>0)//如果当前“石头”未被用的次数大于0,选择出“石头”,平局 不得分
104 {
105 a--;//“石头”可被用的次数-1
106 }
107 else//如果当前“剪刀”未被用的次数大于0,选择出“剪刀”,输 扣1分
108 {
109 b--;//“剪刀”可被用的次数-1
110 sum--;//扣一分
111 }
112 }
113 else if(temp=='J')//如果当前的字符是J:剪刀
114 {
115 if(a>0)//如果当前“石头”未被用的次数大于0,选择出“石头”,可赢 得1分
116 {
117 a--;//“石头”可被用的次数-1
118 sum++;//得一分
119 }
120 else if(b>0)//如果当前“剪刀”未被用的次数大于0,选择出“剪刀”,平局 不得分
121 {
122 b--;//“剪刀”可被用的次数-1
123 }
124 else//如果当前“布”未被用的次数大于0,选择出“布”,输 扣1分
125 {
126 c--;//“布”可被用的次数-1
127 sum--;//扣一分
128 }
129 }
130 else if(temp=='B')
131 {
132 if(b>0)//如果当前“剪刀”未被用的次数大于0,选择出“剪刀”,可赢 得1分
133 {
134 sum++;//得一分
135 b--;//“剪刀”可被用的次数-1
136 }
137 else if(c>0)//如果当前“布”未被用的次数大于0,选择出“布”,平局 不得分
138 {
139 c--;//“布”可被用的次数-1
140 }
141 else
142 {
143 a--;//“石头”可被用的次数-1
144 sum--;//扣一分
145 }
146 }
147 }
148 printf("sum=%d\n",sum);//输出可得最大的总分
149 Destroy(s);//销毁栈
150 }
151 return 0;
152 }
153
154
155
1 #include <stdio.h>
2
3 #define Maxlen 100 //定义输入字符的长度
4
5 //返回字符数组元素的个数
6 int Mystrlen(char *str)
7 {
8 int num = 0;
9 for(;*str!='\0';str++)//当没遇到回车符的时候 字符数目+1
10 num++;
11 return num;
12 }
13
14 int main()
15 {
16 char string[Maxlen];//存储键盘输入的字符串
17 int n,length,a,b,c,sum,i;//n:总执行次数,a:出S次数,b:出J次数,c:出B次数,sum:总成绩;
18 while(1)
19 {
20 printf("input n:");
21 scanf("%d",&n);//输入n
22 if(n==0)break;//当n=0时输入结束
23 sum=0;//总分初始化为0
24 printf("input string:");
25 scanf("%s", string);//输入对手每次出的数据
26 printf("input a b c:");
27 scanf("%d%d%d",&a,&b,&c);//输入a次S,b次J和c次B(a,b,c都是非负并且a+b+c=n)。
28
29 length=Mystrlen(string);//获得输入字符串的长度
30 for(i=0;i<length;i++)
31 {
32 if(string[i]=='S')//如果当前的字符是S:石头
33 {
34 if(c>0)//如果当前“布”未被用的次数大于0,选择出“布”,可赢 得1分
35 {
36 c--;//“布”可被用的次数-1
37 sum++;//得一分
38 }
39 else if(a>0)//如果当前“石头”未被用的次数大于0,选择出“石头”,平局 不得分
40 {
41 a--;//“石头”可被用的次数-1
42 }
43 else//如果当前“剪刀”未被用的次数大于0,选择出“剪刀”,输 扣1分
44 {
45 b--;//“剪刀”可被用的次数-1
46 sum--;//扣一分
47 }
48 }
49 else if(string[i]=='J')//如果当前的字符是J:剪刀
50 {
51 if(a>0)//如果当前“石头”未被用的次数大于0,选择出“石头”,可赢 得1分
52 {
53 a--;//“石头”可被用的次数-1
54 sum++;//得一分
55 }
56 else if(b>0)//如果当前“剪刀”未被用的次数大于0,选择出“剪刀”,平局 不得分
57 {
58 b--;//“剪刀”可被用的次数-1
59 }
60 else//如果当前“布”未被用的次数大于0,选择出“布”,输 扣1分
61 {
62 c--;//“布”可被用的次数-1
63 sum--;//扣一分
64 }
65 }
66 else if(string[i]=='B')
67 {
68 if(b>0)//如果当前“剪刀”未被用的次数大于0,选择出“剪刀”,可赢 得1分
69 {
70 sum++;//得一分
71 b--;//“剪刀”可被用的次数-1
72 }
73 else if(c>0)//如果当前“布”未被用的次数大于0,选择出“布”,平局 不得分
74 {
75 c--;//“布”可被用的次数-1
76 }
77 else
78 {
79 a--;//“石头”可被用的次数-1
80 sum--;//扣一分
81 }
82 }
83 }
84 printf("sum=%d\n",sum);//输出可得最大的总分
85 }
86 return 0;
87 }