队列:1种头部出列,尾部入队的数据结构,当头尾下标相等时队列为空。
队列是广度优先搜索的核心数据结构。
=============================
1.第一个数删除,下一个数放到最后,直到没有数可以再删除,顺序打印删除的数。
//对6,3,1,7,5,8,9,2,4数进行出队入队操作,第一个数出队,下一个数加入到队尾 int q[102]={6,3,1,7,5,8,9,2,4},head,tail; head=0; tail=9;//指向nil while (head<tail) { //打印并出队 printf("%d ",q[head]); head++; //将新的队首添加倒队尾 q[tail]=q[head]; tail++; //再将队首出队 head++; }
使用结构体情况下的实现
struct queue { int data[100]; int head; int tail; }; int main(int argc, const char * argv[]) { //初始化队列 struct queue q; q.head=0; q.tail=0; for (int i = 0; i <9; i++) { scanf("%d",&q.data[q.tail]); q.tail++; } while (q.head<q.tail) { printf("%d ",q.data[q.head]); q.head++; q.data[q.tail] = q.data[q.head]; q.tail++; q.head++; } return 0; }
2栈结构: 通过栈结构保存中间下标前的值,用于判断是否回文数
struct stack{ int data[10]; int top; };
.
//通过栈结构判段回文字符 char a[101],s[101]; int len,mid,next,top; gets(a); len = strlen(a); printf("len = %d ",len); mid = len/2 -1; printf("mid = %d ",mid); if(len%2==0) next = mid+1; else next = mid+2; //将mid前的字符依次入栈 top = 0; s[top] = 't'; for (int i = 0; i <= mid; i++) { printf("num1 = %d ",a[i]); s[++top] = a[i]; } printf("count = %lu ",strlen(s)); printf("top = %d ",top); //开始匹配 for (int i = next; i < len; i++) { printf("f1 = %d f2= %d ",a[i],s[top]); if (a[i] != s[top]) { break; } top--; } if (top==0) { printf("Yes"); }else{ printf("No"); }
4.队列与栈的应用
小猫钓鱼游戏。该游戏主要有2种操作,分别是出牌和赢牌。这恰好对应队列的两个操作,出牌就是出队,赢牌就是入队。小哈的操作与小哼的一样。而桌子就是一个栈,每打出一张牌就放到桌上就相当于入栈。当有人赢牌的时候,依次将牌从桌子上拿走就相当于出栈。赢牌规则是:如果某人打出的牌与桌上的某张牌相同,即可将2张牌以及中间所夹有的牌全部拿走。
//小猫钓鱼游戏。该游戏主要有2种操作,分别是出牌和赢牌。这恰好对应队列的两个操作,出牌就是出队,赢牌就是入队。小哈的操作与小哼的一样。而桌子就是一个栈,每打出一张牌就放到桌上就相当于入栈。当有人赢牌的时候,依次将牌从桌子上拿走就相当于出栈。赢牌规则是:如果某人打出的牌与桌上的某张牌相同,即可将2张牌以及中间所夹有的牌全部拿走。 //初始化队列和栈 int t; int xiaoHeng[] = {2,4,1,2,5,6}; int xiaoHa[] = {3,1,3,5,6,4}; struct stack s; s.top = 0; struct queue q1,q2; q1.head = 1; q1.tail = 1; q2.head = 1; q2.tail = 1; for (int i = 1; i <= 6; i++) { q1.data[q1.tail] = xiaoHeng[i-1]; q1.tail++; } for (int i = 1; i <= 6; i++) { q2.data[q2.tail] = xiaoHa[i-1]; q2.tail++; } //初始化标记,用于牌是否打出某张牌 int book[10]; for (int i = 0; i < 10; i++) { book[i] = 0; } //当队列为空的时候不执行循环 while (q1.head < q1.tail && q2.head < q2.tail) { t = q1.data[q1.head]; //桌面上没有该张牌时 if (book[t] == 0) { //出牌 q1.head++; s.top++; s.data[s.top] = t; book[t] = 1; } else { //赢牌 q1.head++; q1.data[q1.tail] = t; q1.tail++; //小哼赢牌后的操作 while (s.data[s.top] != t) { book[s.data[s.top]] = 0; q1.data[q1.tail] = s.data[s.top]; q1.tail++; s.top--; } } //**********小哈的操作 t = q2.data[q2.head]; if (book[t] == 0) { q2.head++; s.top++; s.data[s.top] = t; book[t] = 1; } else { q2.head++; q2.data[q2.tail] = t; q2.tail++; while (s.data[s.top] != t) { book[s.data[s.top]] = 0; q2.data[q2.tail] = s.data[s.top]; q2.tail++; s.top--; } } } //当一方队列为空时,即有了输赢结果 if (q2.head==q2.tail) { printf("小哼赢牌 手上的牌是:"); for (int i = q1.head; i < q1.tail-1; i++) { printf("%d ",q1.data[i]); } //如果桌面上还有牌则输出 if (s.top>0) { printf(" 桌面的牌是:"); for (int i = s.top; i > 0; i--) { printf("%d ",s.data[i]); } } else { printf(" 桌面上没有更多牌"); } } else { printf("小哈赢牌 手上的牌是:"); for (int i = q2.head; i < q2.tail-1; i++) { printf("%d ",q2.data[i]); } if (s.top > 0) { printf(" 桌面的牌是:"); for (int i = s.top; i > 0; i--) { printf("%d ",s.data[s.top]); } } else { printf(" 桌面上没有更多牌"); } }