c#栈和队列习题
3.1 比较线性表、栈和队列这三种数据结构的相同点和不同点。
栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。
队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同。但它们是完全不同的数据类型。除了它们各自的基本操作集不同外,主要区别是对插入和删除操作的"限定"。
栈和队列是在程序设计中被广泛使用的两种线性数据结构,它们的特点在于基本操作的特殊性,栈必须按"后进先出"的规则进行操作,而队列必须按"先进先出"的规则进行操作。和线性表相比,它们的插入和删除操作受更多的约束和限定,故又称为限定性的线性表结构。
3.2 如果进栈的元素序列为1,2,3,4,则可能得到的出栈序列有多少种?写出全部的可能序列。
首先这是个卡特兰数,有2n个人排成一队进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票可找零,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)。
对于这个例子,剧院要想总有零钱可找,那么目前进入剧院的人数中,揣着10元钞票的人数必须少于等于揣着5元钞票的,不然肯定在某个人那出现没零钱找的情况。
现在回到正题上来对于一个给定入栈序列,怎么求它的出栈序列呢?
我们可以把入栈记为1,出栈记为0.那么前缀子序列中1的个数必须大于等于0的个数,即入栈次数要大于等于出栈次数,如1 1 0 1 0 0,它的任意前缀序列中1的个数是大于等于0的个数的。
我们来看个例子:对于1 2 3这个入栈序列,1 1 0 1 0 0就是一个入栈出栈序列,第一个1代表元素1入栈,然后第二个1代表元素2入栈,然后第三个是0,代表出栈,即元素2出栈,然后第四个是1,代表元素3入栈,然后第五个是0,代表出栈,即元素3出栈,然后第六个是0,代表元素1出栈。最后1 1 0 1 0 0就代表了出栈序列2 3 1。
那么现在的问题就转换为如何求出所有符合条件的0 1序列了。其实这和以下问题相同:给定括号对数,输出所有符合要求的序列。如2对括号,输出有()()或者(())两种。1可以看成'(',0可以看成‘)’。
卡特兰数
首先是卡特兰数的定义:令h(0)=1,h(1)=1,catalan数满足递推式:
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + … + h(n-1)h(0) (n>=2)。
可以根据上面的递推公式,写出递归的计算方案。
public static int Catalan(int n)
{
int nCount = ;
if ( n < )
{
return ;
}
if ( == n || == n )
{
return ;
}
for (int i = ; i < n; ++i )
{
nCount += Catalan(i) * Catalan(n - i - );
}
return nCount;
}
3.3 如果进栈的元素序列为A,B,C,D,E,F,能否得到D,C,E,F,A,B和A,C,E,D,B,F的出栈序列?并说明为什么不能得到或如何得到。
D,C,E,F,A,B 不能得到,把A 和B的位置换一下可以
A,C,E,D,B,F 可以。A进栈A出栈 B进,C进,C出,D进E进,E出,D出,B出,F进F出
3.4 写出例题3-3中的precede函数和Operate函数。
3.5 写一算法将一顺序栈的元素依次取出,并打印元素值。
将栈的元素倒置呗,我们考虑将栈元素弹出后放入另一个栈,然后输出
// 写一算法将一顺序栈的元素依次取出,并打印元素值。
public static void ReverseStack(int _n)
{
if ( _n < 0 )
{
return;
}
SeqStack<int> stack = new SeqStack<int>(_n);
SeqStack<int> revStack = new SeqStack<int>(_n);
for (int i = 0; i < _n; ++i)
{
stack.Push(i+1);
} for (int i = 0; i < _n; ++i )
{
revStack.Push(stack.Pop()); } for (int i = 0; i < _n; ++i)
{
Console.WriteLine("栈的元素依次为" + revStack.Pop());
}
}
3.6 在顺序队列中,什么叫真溢出?什么叫假溢出?为什么顺序队列通常都采用循环顺序队列结构?
当有数据元素入队时,队尾指示器rear加1,当有数据元素出队时,队头指示器front加1。当front=rear时,表示队列为空,队尾指示器rear到达数组的上限处而front为-1时,队列为满。
如上图再有一个数据元素入队就会出现溢出。但事实上队列中并未满,还有空闲空间,把这种现象称为“假溢出”。这是由于队列“队尾入队头出”的操作原则造成的。解决假溢出的方法是将顺序队列看成是首尾相接的循环结构,头尾指示器的关系不变,这种队列叫循环顺序队列。
//求循环顺序队列的长度
public int GetLength()
{
return (rear-front+maxsize) % maxsize;
}
//清空循环顺序队列
public void Clear()
{
front = rear = -;
}
//判断循环顺序队列是否为空
public bool IsEmpty()
{
if (front == rear)
{
return true;
}
else
{
return false;
}
}
//判断循环顺序队列是否为满
public bool IsFull()
{
if ((rear + ) % maxsize==front)
{
return true;
}
else
{
return false;
}
}
//入队
public void Enqueue(T item)
{
if (IsFull())
{
Console.WriteLine("队列已满");
return;
}
data[++rear] = item;
}
//出队
public T Dequeue()
{
T tmp = default(T);
if (IsEmpty())
{
Console.WriteLine("队列为空");
return tmp;
}
tmp = data[++front];
return tmp;
}
//获取队头数据元素
public T GetFront()
{
if (IsEmpty())
{
Console.WriteLine("Queue is empty!");
return default(T);
}
return data[front + ];
}
3.7 写一算法将一链队列的元素依次取出,并打印元素值。
public static void PrintLinkQueue(int _n)
{
LinkQueue<int> queue = new LinkQueue<int>();
for (int i = ; i < _n; ++i)
{
queue.Enqueue(i + );
Console.WriteLine("队列的元素依次为" + queue.Dqueue());
}
}
3.8 将例题3-4用链队列和顺序队列实现,并能处理输入的字符不是大小写
英文字符的情况。
好了就写到这里,至于优先级的问题,以后有时间再说
c#栈和队列习题的更多相关文章
- 3-6-汉诺塔(Hanoi Tower)问题-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版
课本源码部分 第3章 栈和队列 - 汉诺塔(Hanoi Tower)问题 ——<数据结构>-严蔚敏.吴伟民版 源码使用说明 链接☛☛☛ <数据结构-C语言版> ...
- ACM金牌选手讲解LeetCode算法《栈和队列的高级应用》
大家好,我是编程熊,双非逆袭选手,字节跳动.旷视科技前员工,ACM金牌,保研985,<ACM金牌选手讲解LeetCode算法系列>作者. 上一篇文章讲解了<线性表>中的数组.链 ...
- 学习javascript数据结构(一)——栈和队列
前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...
- [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)
再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...
- 剑指Offer面试题:6.用两个栈实现队列
一.题目:用两个栈实现队列 题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 原文是使用 ...
- C实现栈和队列
这两天再学习了数据结构的栈和队列,思想很简单,可能是学习PHP那会没有直接使用栈和队列,写的太少,所以用具体代码实现的时候出现了各种错误,感觉还是C语言功底不行.栈和队列不论在面试中还是笔试中都很重要 ...
- JavaScript数组模拟栈和队列
*栈和队列:js中没有真正的栈和队列的类型 一切都是用数组对象模拟的 栈:只能从一端进出的数组,另一端封闭 FILO 何时使用:今后只要仅希望数组只能从一端进 ...
- 用JS描述的数据结构及算法表示——栈和队列(基础版)
前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里 ...
- JavaScript中的算法之美——栈、队列、表
序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...
随机推荐
- Android 6.0动态申请权限时,权限框闪一下就消失的问题;
Android 蓝牙BLE开发需要位置权限,不然扫描不到周围的蓝牙信息: 位置权限申请: if (Build.VERSION.SDK_INT < 23){return;} //判断是否有权限 i ...
- Android CoordinatorLayout实现多列表切换并和头布局联动;
注意:不是双列表联动,是多列表和头布局联动: 大概就是和饿了么店铺首页类似的布局框架吧,头布局显示时,列表RecyclerView或ScrollView和头布局一起滚动,头布局完全隐藏后列表再去滚动, ...
- 微信小程序自定义微信客服按钮
微信小程序官方api中提到的微信客服,是一个固定的组件,图标样式固定,大小最多27px 很明显这个是不能满足我们各种奇葩需求的.下面提供一个野蛮的自定义方法. 比如做一个这样的按钮: 图标用自定义的, ...
- TessorFlow学习 之 神经网络的构建
1.建立一个神经网络添加层 输入值.输入的大小.输出的大小和激励函数 学过神经网络的人看下面这个图就明白了,不懂的去看看我的另一篇博客 def add_layer(inputs , in_size , ...
- js数据类型 --运算符
基本数据类型: number: var a=1; string: var str='123'; boolean: var b1=false; null:var c1=null; //打印结果为 obj ...
- android 开发 时间选择器TimePicker的使用
android系统自带时间控件:DatePicker 日期显示控件 DatePickerDialog 日期对话框控件TimePicker 时间显示控件 TimePickerDialog 时间对话框控件 ...
- JAVA获取文件夹下所有的文件
package com.test; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; im ...
- iOS重写和成员变量访问权限
一.重写机制 1.覆盖父类的方法 2.对父类方法做进一步的补充 注意:父类声明过得方法,子类无需声明. * 子类如果重写了父类的方法: 1.父类的指针指向子类的对象,则调用方法时,调用的是子类的方法: ...
- layui动态options
layui 坑 layui 针对各种表单元素做了较为全面的UI支持,你无需去书写那些 UI 结构,你只需要写 HTML 原始的 input.select.textarea 这些基本的标签即可.我们在 ...
- Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
转自:https://www.zhihu.com/question/20948649?sort=created 我最近也遇到这个问题了,用传统的快捷方式加参数并没有用,不知道是不是和chrome版本有 ...