嗯,首先看看题目描述,显然,这是一道关于队列,栈的数据结构题,但是对于用c的朋友们来说有没有不用c++ STL库里面的函数用数组模拟队列,栈而写出来呢?
还是有方法的,这里就是一个小白闲着无聊,模拟着模拟着就出来了,
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> char ch[105][1000]; char st_ack[10000]; int t_op=0,tops[10001]; int n,m,len,k; void p_op(int k) { if (t_op > 0) { printf("%c",st_ack[t_op]); t_op--; } } void p_ush(int k) { if (t_op >= len) { p_op(k); } t_op++; st_ack[t_op] = ch[k][tops[k]++]; } int main() { memset(tops,0,sizeof(tops)); scanf("%d%d%d",&n,&m,&len); for (int i=1; i<=n; i++) { scanf("%s",&ch[i]); } while (scanf("%d",&k) != EOF) { if (k == -1) { break; } if (k == 0) { p_op(k); } if (k != 0 && tops[k] < m) { p_ush(k); } } return 0; }
不想在代码段写注释了,方便复制的朋友们直接copy了,这里简单讲一下思路,
1.用二维字符串数组先把这些输入的字符串存进去。
(此代码中存进去的字符串方法若看不懂请翻书)
2.创建一个字符串数组st_ack来模拟栈,一个t_op表示st_ack栈顶
3.创建一个tops数组表示n个队列的顶部
(如tops【1】表示第一个字符串数组ch【1】【】这个字符串的顶部,后面每次推进去st_ack,顶部就向后退一个直到退到m为止)
4.写函数,p_op函数就是从栈推出去一个元素了,p_ush就推进去栈里一个元素
(注意坑点,这里面,最好把先判断tops【k】< M 这个条件先判断了)
(讲人话就是先判断你目前的第K列字符串是否顶部超过了M,是的话就不进行操作)
不要放在p_ush()里面判断,因为p_ush()这个函数只要进去了,就一定要推进去东西,我被这个小点给卡掉了半小时,debug发现没啥错误的地方,然后幡然醒悟。。