总结
- 桌上牌的进出顺序(先进后出)符合栈的特点,定义stack用于存放桌上牌的顺序,
持牌人的出牌顺序(先进先出)符合队列的特点,定义queue1、queue2分别存放A、B两方牌顺序; - 定义flag=1表示轮到A方出牌,flag=2表示轮到B方出牌;
- 首先由A方出牌,stack接收牌的同时查看stack里面是否存在一样的牌面,【若存在】则把A方队列queue1的首元素移至队尾,再把栈stack的元素一个个从栈顶移至queue1队尾,直到遇到相同的牌面;【若不存在】就只是往栈stack里添加queue1的首元素,并且查看queue1里是否有剩余元素,【若无】则B方赢,输出queue2队列里的所有元素,游戏结束,【若有】则令flag=2,代表接下来B方出牌,接下来的情况与A出牌类似。
4.需注意 当游戏无法结束时,输出-1,由于输入的串的长度不超过30,如果游戏能结束,或许两人出牌的次数不会超过10000,如果超过了,应该是游戏无法结束的情况。
代码
import java.util.Scanner;
import java.util.Stack;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin=new Scanner(System.in);
Stack <String> stack;
Queue<String> queue1,queue2;
int flag,id;
String s1,s2,top;
while(cin.hasNext()) {
stack = new Stack<String>(); //先进后出(桌面收牌)
queue1 = new LinkedList<String>(); //先进先出(玩家1存牌)
queue2 = new LinkedList<String>(); //先进先出(玩家2存牌)
s1=cin.next();
s2=cin.next();
flag=1;
id=0;
for(int i=0;i<s1.length();i++) {
queue1.offer(s1.charAt(i)+"");
queue2.offer(s2.charAt(i)+"");
}
while(id!=10000) {
id++;
top="";
if(flag==1) { //A发牌
top=queue1.poll(); //取出第一张牌
if(stack.contains(top)) {
queue1.offer(top);
while(!(stack.peek()).equals(top) ) {
queue1.offer(stack.pop());
}
queue1.offer(stack.pop());
continue;
}else {
stack.push(top);
if(queue1.isEmpty()) {
for(String q : queue2){
System.out.print(q);
}
System.out.println();
break;
}
flag=2;
}
}
if(flag==2) { //B发牌
top=queue2.poll(); //取出第一张牌
if(stack.contains(top)) {
queue2.offer(top);
while(!(stack.peek()).equals(top)) {
queue2.offer(stack.pop());
}
queue2.offer(stack.pop());
continue;
}else {
stack.push(top);
if(queue2.isEmpty()) {
for(String q : queue1){
System.out.print(q);
}
System.out.println();
break;
}
flag=1;
}
}
}
if(id==10000)
System.out.println(-1);//游戏无法结束
}
}
}