博客作业03--栈和队列
1.学习总结
1.1
顺序栈,链栈,顺序队列,环形队列,链式队列
1.2
2.PTA实验作业
2.1 题目1:7-1 jmu-字符串是否对称
2.2 设计思路
for i=0 to str[i]=='\0'
将str[i]的字符入栈到st
end
for i=0 to str[i]=='\0'
将字符出栈赋予e
若str[i]!=e,则不对称,返回false
若str[i]==e,则继续循环,直到遍历完数组。
end
返回true
2.3 代码截图
2.4 PTA提交列表说明
- 1.一开始输入字符串用的是getchar( )循环,但一直段错误。
解决方法:用gets直接输入字符串。
2.1 题目2:7-2 银行业务队列简单模拟
2.2 设计思路
输入用户
for i=0 to i<n
若为偶数,则qb.push(a[i]),否则qa.push(a[i])。
end for
while(!qa.empty()&&!qb.empty())
队列a出队两次
队列b出队一次
end
剩下那队的全部出队
输出
2.3 代码截图
2.4 PTA提交列表说明
- 没有什么大问题
2.1 题目3:7-3 银行排队问题之单队列多窗口服务
2.2 设计思路
创建结构体person,存放每个人的信息,创捷结构体window,存放每个窗台信息。
for i=0 to i<N
输入每个用户的到达时间t和所需时间p并将所有人的wait时间初始化为0
if(p>60) p=60
end
for i=0 to i<K
初始化每个柜台的时间和服务人数。
end
定义 maxwait=0,sumwait=0,flag=0;
while(!Q.empty())
for(i=0; i<K; i++)
若W[i].t1<=Q.front().t,则当前顾客不需要等待,然后对柜台时间进行计算W[i].t1=Q.front().t+Q.front().p ,柜台服务人数W[i].num++,flag=1表明柜台已经有人在使用,该用户出队,break跳出循环。
end for
若flag==0,则当前顾客需要选择最优窗口等待。
定义 minwait=666666,tmp。
for(i=0; i<K; i++)遍历柜台,若有柜台时间W[i].t1<minwait,则minwait=W[i].t1,用tmp记下是哪个柜台时间最短tmp=i
end for
柜台存在,则该用户需要等待时间Q.front().wait=minwait-Q.front().t,并求和等待时间sumwait+=Q.front().wait,该柜台服务时间W[tmp].t1+=Q.front().p;
若Q.front().wait>maxwait,maxwait=Q.front().wait,柜台服务人数再加一W[tmp].num++,然后该用户出队。
end while
int lastTime=0;
for(i=0;i<K;i++)遍历柜台,看谁的时间最长,则 lastTime=W[i].t1
输出平均等待时间,最长等待时间、最后完成时间。
2.3 代码截图
2.4 PTA提交列表说明
- 1.一开始没用用两个结构体导致用户和柜台的关系不清楚,难以进行操作。
解决方法:参考了网上的资料。 - 2.在计算Q.front().wait时,没有具体搞清相差的时间,算错了。
解决方法:改成Q.front().wait=minwait-Q.front().t
3.截图本周题目集的PTA最后排名
3.1 栈PTA排名
3.2 队列PTA排名
3.3 我的总分:230
4. 阅读代码
public static ArrayList<Integer> twoStacksSort(int[] numbers) {
if(numbers == null)
return null;
Stack<Integer> stack = new Stack<Integer>();
for(int i = numbers.length - 1; i >= 0; i--){
stack.push(numbers[i]);
}
Stack<Integer> help = new Stack<Integer>();
int pop,temp;
while(!stack.isEmpty()){
pop = stack.pop();
if(help.isEmpty()){
help.push(pop);
}else{
if(pop <= help.peek()){
help.push(pop);
}else{
while(!help.isEmpty() && pop > help.peek()){//将help中元素放入到stack中
temp = help.pop();
stack.push(temp);
}
//help栈为空了或者找到了pop<=help栈顶的元素
help.push(pop);
}
}
}
while(!help.isEmpty()){
stack.push(help.pop());
}
ArrayList<Integer> res = new ArrayList<Integer>();
while(!stack.isEmpty()){
res.add(stack.pop());
}
return res;
}
- 该代码的作用是对栈中元素排序。假设栈stack是存放原来数据的,再定义一个辅助栈help,先从stack栈中取出栈顶元素pop,将pop和help中栈顶元素比较,如果pop <= help栈顶元素,将pop压入到help栈中;如果pop > help栈顶元素,取出help栈顶元素,将其放入到stack栈中,直到help为空或者pop <= help栈顶元素。
- https://blog.csdn.net/shakespeare001/article/details/51469268