程序员在旅途

用这生命中的每一秒,给自己一个不后悔的未来!

0%

一、栈的概念介绍

  在我们的生活中,总有这么一些例子,①食堂在堆放餐盘的时候,总是从下往上,在取餐盘的时候,又是从上往下;②最先放入厢式货车的货物,最后才能取出;③普通手枪的子弹夹,先装进弹夹的子弹,最后才会被打出来。类似于这样的场景还有很多,这样的存取顺序,我们称之为先进后出(LIFO)。这种存取方式在解决某些计算机问题的时候非常高效,因此,在计算机科学中抽象出了一种数据结构,专门用于解决后进先出这类科学问题,在计算机中,这种后进先出的数据结构,我们称之为 栈。栈这种数据结构被抽想出来以后,就被广泛的应用于计算机软硬件系统中,在编译系统、操作系统等系统软件和各类应用软件中经常使用栈来高效的完成特定的算法设计。在许多程序语言设计中,函数的调用,就会使用栈来保存形参以及函数的返回值。在硬件层面,有专门的栈寄存器来配合栈数据结构的高效访问。
  栈的逻辑结构是一种线性结构,和线性表相同,元素之间是一对一的关系,由于需要保证元素的后进先出规则,因此需要对线性表的运算操作进行一定的限制,即只允许在线性表的一端进行插入和删除来满足栈的要求。因此可以认为栈是限制在表的一端进行插入和删除的线性表。在线性表中允许插入、删除的这一端称为栈顶,栈顶的位置是动态变化的;不允许操作的这一端称为栈底,栈底是固定不变的。当表中没有元素时称为空栈。
  对于栈而言,常用的操作有:①栈的初始化; ②判断栈是否为空;③入栈;④出栈;⑤取栈顶元素;⑥销毁栈。这些基本的操作是组成复杂程序的基础。栈的示意图如下:栈示意图
  栈的物理实现有两种方式,分别为顺序存储方式链式存储方式。采用顺序存储的栈我们称之为顺序栈,采用链式存储结构的栈称之为链式栈。

阅读全文 »

一、约瑟夫问题的由来

  约瑟夫问题(Josephus)是由古罗马的史学家约瑟夫(全名Titus Flavius Josephus)提出的。它是一个出现在计算机科学和数学中的经典问题。在计算机编程的算法中,类似问题又称为约瑟夫环。
  Josephus是1世纪的一名犹太历史学家。他在自己的日记中写道,他和他的40个战友被罗马军队包围在洞中。他们讨论是自杀还是被俘,最终决定自杀,并以抽签的方式决定谁杀掉谁。41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。Josephus将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
  约瑟夫问题的一般描述形式为:设有编号为1,2,……,n的N个人围成一个圈,从第1个人开始报数,报到M时停止报数,报M的人出圈,再从他的下一个人起重新报数,报到M时停止报数,报M的出圈,……,按照这个规则进行下来,直到所有人全部出圈为止。当任意给定N和M后,构建相关数据结构与算法求N个人出圈的次序。

阅读全文 »

一、题目描述

  有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数(m<n)。

阅读全文 »

一、题目描述

  通过循环按行顺序为一个5*5的二维数组赋1到25的自然数,然后输出该数组的左下半三角。

阅读全文 »