数据结构(C#版)笔记(二)

16.双向链表
在结点中设两个引用域,一个保存直
接前驱结点的地址,叫 prev,一个直接后继结点的地址,叫 next,这样的链表就
是双向链表(Doubly Linked List)。

插入操作:
➀ p.Next.Prev = s;
➁ s.Prev = p;
➂ s.Next = p.Next;
➃ p.Next = s;

删除操作:
➀ p.Next = P.Next.Next;
➁ p.Next.Prev = p.Prev;

17.循环链表
有些应用不需要链表中有明显的头尾结点。在这种情况下,可能需要方便地
从最后一个结点访问到第一个结点。此时,最后一个结点的引用域不是空引用,
而是保存的第一个结点的地址。
循环链表的基本操作与单链表大体相同,只是判断链表结束的条件并不是判
断结点的引用域是否为空,而是判断结点的引用域是否为头引用。

18.栈和队列
栈的操作只能在表的一端进行,队列的插入操作在表的一端进行而其它操作在表
的另一端进行,所以,把栈和队列称为操作受限的线性表。
栈的操作主要包括在栈顶插入元素和删除元素,取栈顶元素和判断栈是否为空等

19.关键字default
在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:
T 是引用类型还是值类型。
如果 T 为值类型,则它是数值还是结构。
给定参数化类型 T 的一个变量 t,只有当 T 为引用类型时,语句 t = null 才有效;只有当 T 为数值类型而不是结构时,语句 t = 0 才能正常使用。解决方案是使用 default 关键字,此关键字对于引用类型会返回空,对于数值类型会返回零。对于结构,此关键字将返回初始化为零或空的每个结构成员,具体取决于这些结构是值类型还是引用类型。以下来自 GenericList<T> 类的示例显示了如何使用 default 关键字。

20.链栈
栈的另外一种存储方式是链式存储,这样的栈称为链栈(Linked Stack),链栈通常用单链表来表示,它的实现是单链表的简化。
为了操作方便,把栈顶设在链表的头部,并且不需要头结点。
求链栈的长度时,必须把栈中的数据元素一个个出栈,每出栈一个数据元素,计数器就增加1,但这样会破坏栈的结构,为保留栈中的数据元素,需把出栈的数据元素先压入另外一个栈,计算完长度后,再把数据元素压入原来的栈。但这种算法的空间复杂度和时间复杂度都很高,所以,以上两种算法都不是理想的解决方法。理想的解决方法是 LinkStack<T>类增设一个字段 num表示链栈中结点的个数

21.例子:数制的转化问题 10进制转8进制
算法思想如下:当 N>0 时,重复步骤 1 和步骤 2。
步骤 1:若 N≠0,则将 N%8 压入栈中,执行步骤 2;若 N=0。则将栈的内
容依次出栈,算法结束。
步骤 2:用 N/8 代替 N,返回步骤 1。
用链栈存储转换得到的数位。
算法实现如下:

public void Conversion(int n)
{
LinkStack<int> s = new LinkStack<int>();
while(n > 0)
{
s.Push(n%8);
n = n/8;
}
while(!s.IsEmpty())
{
n = s.Pop();
Console.WriteLine(“{0}”, n);
}
}

链栈还可以做括号匹配,表达式求值等问题 详见数据结构(C#版)

22.队列
队列(Queue)是插入操作限定在表的尾部而其它操作限定在表的头部进行的线性表。把进行插入操作的表尾称为队尾(Rear),把进行其它操作的头部称为队
头(Front)。当对列中没有数据元素时称为空对列(Empty Queue)。
出队的次序与入队相同,队列的操作是按照先进先出的原则进行的。
解决假溢出的方法是将顺序队列看成是首尾相接的
循环结构,头尾指示器的关系不变,这种队列叫循环顺序队列(Circular sequenceQueue)。

23.循环顺序队列的长度取决于队尾指示器 rear 和队头指示器 front。一般情
况下,rear 大于 front,因为入队的元素肯定比出队的元素多。特殊的情况是
rear 到达数组的上限之后又从数组的低端开始,此时,rear 是小于 front 的。
所以,rear 的大小要加上 maxsize。因此,循环顺序队列的长度应该是:
(rear-front+maxsize)%maxsize。

24.队列应用实例
判断一个字符序列是否是回文,回文是指一个字符序列以中间字符为基准两边字符完全相同。
把字符序列分别入队列和栈,然后逐个出队列和出栈并比较出队
列的字符和出栈的字符是否相等,若全部相等则该字符序列就是回文,否则就不
是回文。
使用循环顺序队列和顺序栈的程序如下:

public static void Main()
{
SeqStack<char> s = new SeqStack<char>(50);
CSeqQueue<char> q = new CSeqQueue<char>(50);
string str = Console.ReadLine();
for(int i = 0; i < str.Length; ++i)
{
s.Push(str[i]);
q.In(str[i]);
}
while(!s.IsEmpty() && !q.IsEmpty())
{
if(s.Pop() != q.Out())
{
break;
}
}
if(!s.IsEmpty() || !q.IsEmpty())
{
Console.WriteLine(“这不是回文! ”);
}
else
{
Console.WriteLine(“这是回文! ”);
}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值