博客作业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

5. 代码Git提交记录截图

posted @ 2018-04-14 09:26  oracler  阅读(367)  评论(1编辑  收藏  举报