博客作业03--栈和队列

1.学习总结

1.1写出你认为本周学习中比较重要的知识点关键词

逻辑结构:简单来说是数据与数据间关系的一种形式,主要有以下几类,1.集合 2.线性结构 3.树形结构 4.图形结构, 其中3和4也称为非线性结构

存储结构:把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现,由此得到的存储表示称为顺序存储结构。

栈:是一种只能在一端进行插入或删除操作的线性表,遵从后进先出原则,分为栈的顺序存储结构和栈的链式存储结构

队列:是一种操作受限的线性表,其限制为仅允许在表的一端进行插入,而在表的另一端进行删除,有队列的顺序存储结构(包括1.顺序队 2.环形队)和队的链式存储结构

串:是由零个或多个字符组成的有限序列,分为顺序串和链串,经典模式匹配法有BF算法和KMP算法

1.2 使用思维导图将这些关键词组织起来

2.PTA实验作业

2.1 .1题目1:题目名称:栈7-3 表达式转换

2.1.2 设计思路(伪代码或流程图)

while(从中缀表达式exp中读取字符ch)
{         ch为数字:将后续的所有数字存放入postexp栈中,并以#标志结束
          ch为左括号‘(’:将此括号进栈到op
          ch为右括号‘)’:将op中出栈时遇到的第一个左括号‘(’以前的运算符依次出栈并存放到opstexp中,然后将‘(’出栈
          ch为‘+’或‘-’:出栈运算符并存放到postexp中,直到栈空或者栈顶为‘(’,然后将‘+’或‘-’进栈op
                              如果ch为‘-’且前一个字符为‘(’,则将‘-’进栈op再将‘!’进栈   说明:!是用来标记为负数时候的情况
                              如果ch为‘+’且前一个字符为‘(’,则读取下一个字符ch,说明:不需要把这个'+'号再入栈,就把它当做判断正数的标志,接着跳过它,读取下一个字符
          ch为‘*’或‘/’:若栈顶为‘*’或‘/’,出栈,直到栈顶不是‘*’或*/,否则入栈
          ch为小数点‘.’:将其进栈postexp
}
若exp扫描完毕,则将op中的所有运算符一次出栈并存放到postexp中
while(从postexp栈中读取ch)
{         ch为‘#’:输出空格,如果ch为最后一个字符,则不输出
          ch为数字:直接输出
          ch为‘-’:如果后一个字符为‘!’,直接输出‘-’
                        否则先输出‘-’,再输出空格
           ch为‘+’:如果ch为第一个元素,则直接输出不带空格
                          否则输出后再输出空格
           ch为‘*’或‘/’:输出ch后再输出空格
           ch为‘.’:输出ch

}

2.1.3 代码截图



2.1.4 PTA提交列表说明



错误:除一个字符是‘+’外要输出,其余表示正数的‘+’不需要输出,但还是输出了,例子如下,只需输出16即可,不需要再输出‘+’号

改正:如果ch为‘+’且前一个字符为‘(,则能说明此‘+’号并不是运算符,而是表示接下来的数是个正数,所以跳过该字符,不需将其进栈op即可

2.2.1题目2:队列题目名称:jmu-ds-舞伴问题

2.2.2设计思路(伪代码或流程图)

n为总人数 m为报数

for i=1 to n
        将1到n的数字依次存放进队列q
end for
while(遍历队列q)
{             如果队列元素的下标为m的倍数且不为最后一个,则取出该元素,输出后再输出空格
              如果队列元素的下标为m的倍数且为最后一个,则取出该元素,输出该元素
              如果队列元素的下标不为m的倍数,则将其存入队列q的队尾
}

2.2.3代码截图

2.2.4PTA提交列表说明


分析:本题虽然是一次就过了,但是调试过程中还是有碰到问题
问题:没有分析最后一次输出的情况,导致末尾仍然带有空格,接下来以#为标志测试结果,明显依旧输出了空格

解决方法:调试发现最后一次输出时q.front==q.rear,以此为条件设特例,在此条件下直接输出元素,不需要带空格,再以#为标志测验,正确

2.3.1题目3:题目名称:7-2 银行业务队列简单模拟

2.3.2设计思路(伪代码或流程图)

for i=0 to n
            将编号存放进输出a[i]
            如果a[i]为奇数,存放进队列A
            否则存放进队列B
end for
while(遍历队列A,B)
{
    count存放当前业务人数,n为业务总人数
    如果B队列为空,则输出所有A队列的元素,最后一个不带空格,n为1时,输出不带空格
    如果A队列为空,则输出所有B队列的元素,最后一个不带空格,n为1时,输出不带空格
    如果count为3的倍数,则从B队列中取出元素,并且输出,再输出空格,count满人则不需要输出空格
    否则从A队列中取出元素,并且输出,再输出空格,count满人则不需要输出空格
}

2.3.3代码截图

2.3.4PTA提交列表说明


错误:格式错误,跟上题类型相同,也是末尾带空格的问题,只不过是在A队列为空或者B队列为空这个特殊性下实现

解决方法:特例解决,如果n为1时,则输出元素,不需再输出空格

3.截图本周题目集的PTA最后排名

3.1 栈PTA排名

3.2 队列PTA排名

3.3 我的总分:205

4. 阅读代码

public class SortStackByStack{
    public static void sortStackByStack(Stack<Integer> stack){
    Stack<Integer>help=new Stack<Integer>();
    while(!stack.isEmpty()){
        int cur=stack.pop();
        while(!help.isEmpty()&&help.peek()<cur){
            stack.push(help.pop());
        }
        help.push(cur);
    }
    while(!help.isEmpty()){
        stack.push(help.pop());
    }
}
}

功能:通过一个栈help排序另一个栈stack

过程:stack 弹出元素cur,如果cur小于等于help栈顶元素,则cur压入help, cur大于help栈顶则将help的元素逐一弹出压入stack,直到cur小于或等于help栈顶,最终能实现降序输出,

优点:方法很类似于中缀表达式转后缀表达式的过程,但不一样的是转后缀表达式是字符ch大于op栈中的元素时进栈op,小于等于op栈栈顶元素则取出op栈顶元素,直至大于op栈栈顶元素,对于刚学中缀转后缀表达式的我,比较好理解

地址:https://blog.csdn.net/u012073449/article/details/51999451

5. 代码Git提交记录截图

posted @ 2018-04-14 21:57  朱杰伟  阅读(367)  评论(2编辑  收藏  举报