设计思路:建立一个数组储存数据,用指针建立一个双向链,用一个循环一次输出第一数组到链中,如果输出的数和储存在链中的最后一个数相同则存入链中,如果不同,链中消去一个数,如果链中没数了,则存入链中。直到循环完成。输出链中的第一个数。
代码实现:
#include<iostream>
#include<string>
using namespace std;
int main()
{
typedef struct list
{
string data;
struct list *prior;
struct list *next;
}list, *llist;
string a[100];
llist l,p,r;
l=new list;
p = l;
r = l;
l->data = "";
for (int i = 0; i < 100; i++)
{
a[i] = ‘a‘;
}
for (int i = 0; i < 10; i++)
{
a[i] = ‘b‘;
}//设置测试数据
for (int i = 1; i < 100; i++)
{
if (l->data == "")//如果链头为空,则插入数据
{
l->data = a[i];
}
else//链头不空
{
if (r->data == a[i])//链尾和输入的数据一样,把数据插入链
{
p = new list;
p->data = a[i];
r->next = p;
p->prior = r;
r = p;
}
else//输入数据不一样,
{
if (r == l)//若是链头,设为空
{
l->data ="";
l->next = NULL;
}
else//删除链中的最后一个
{
p = r->prior;
delete r;
r = p;
}
}
}
}
cout <<"水王是"<< l->data<<endl;
}
截图:

心得:
这个算法的雏形是老师说的两两相消,但是两两相消的话有些情况比如,a,a,b,b,a,a不能消,但是累计相消的话,就可以。
原文:http://www.cnblogs.com/zuhaoran/p/5535369.html