:先进后出,只能在栈顶进行操作。

栈的操作主要包括在栈顶插入元素和删除元素、取栈顶元素和判断栈是否为空等。

栈的接口定义:

    public interface IStack<T>
{
int GetLength(); //求栈的长度
bool IsEmpty(); //判断栈是否为空
void Clear(); //清空操作
void Push(T item); //入栈操作 T
Pop(); //出栈操作
T GetTop(); //取栈顶元素
}

字段 top 表示栈顶,top 的范围是0 到 maxsize-1,如果顺序栈为空,top=-1

顺序栈类 SeqStack<T>的实现:

    public class SeqStack<T> : IStack<T>
{
private int maxsize; //顺序栈的容量
private T[] data; //数组,用于存储顺序栈中的数据元素
private int top; //指示顺序栈的栈顶
//索引器
public T this[int index]
{
get { return data[index]; }
set { data[index] = value; }
}
//容量属性
public int MaxSize
{
get { return maxsize; }
set { maxsize = value; }
}
//栈顶属性
public int Top
{
get { return top; }
}
//构造器
public SeqStack(int size)
{
data = new T[size];
maxsize = size;
top = -;
}
//求栈的长度
public int GetLength()
{
return top + ;
}
//清空顺序栈
public void Clear()
{
top = -;
}
//判断顺序栈是否为空
public bool IsEmpty()
{
if (top == -)
{
return true;
}
else
{
return false;
}
}
//判断顺序栈是否为满
public bool IsFull()
{
if (top == maxsize - )
{
return true;
}
else
{
return false;
}
}
//入栈
public void Push(T item)
{
if (IsFull())
{
return;
}
data[++top] = item;
}
//出栈
public T Pop()
{
T tmp = default(T);
if (IsEmpty())
{
return tmp;
}
tmp = data[top];
--top;
return tmp;
}
//获取栈顶元素
public T GetTop()
{
if (IsEmpty())
{
return default(T);
}
return data[top];
}
}

SeqStack

链栈 通常用单链表来表示,栈顶设在链表的头部,并且不需要头结点
链栈结点类(Node<T>)的实现:

    public class Node<T>
{
private T data; //数据域
private Node<T> next; //引用域 //构造器
public Node(T val, Node<T> p)
{
data = val;
next = p;
}
//构造器
public Node(Node<T> p)
{
next = p;
}
//构造器
public Node(T val)
{
data = val;
}
//数据域属性
public T Data
{
get { return data; }
set { data = value; }
}
//引用域
public Node<T> Next
{
get { return next; }
set { next = value; }
}
}

Node

链栈类 LinkStack<T>的实现: LinkStack<T>类增 设一个字段 num 表示链栈中结点的个数。

    public class LinkStack<T> : IStack<T>
{
private Node<T> top; //栈顶指示器
private int num; //栈中结点的个数 //栈顶指示器属性
public Node<T> Top
{
get { return top; }
set { top = value; }
}
//元素个数属性
public int Num
{
get { return num; }
set { num = value; }
}
//构造器
public LinkStack()
{
Top = null;
num = ;
}
//求链栈的长度
public int GetLength()
{
return num;
}
//清空链栈
public void Clear()
{
top = null;
num = ;
}
//判断链栈是否为空
public bool IsEmpty()
{
if ((top == null) && (num == ))
{
return true;
}
else
{
return false;
}
}
//入栈
public void Push()
{
Node<T> q = new Node<T>(item);
if (top == null)
{
top = q;
}
else
{
q.Next = top;
top = q;
}
++num;
}
//出栈
public T Pop()
{
if (IsEmpty())
{
return default(T);
}
Node<T> p = top;
top = top.Next;
--num;
return p.Data;
}
//取栈顶结点的值
public T GetTop()
{
if (IsEmpty())
{
return default(T);
}
return top.Data;
}
}

LinkStack

 进制转换:将一个十进制数 N 转换为八进制数:利用辗转相 除法,转换得到的八进制数各个数位

算法思想如下:当 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 > )
{
s.Push(n%);//余数入栈
n = n/;
}
while(!s.IsEmpty())
{
n = s.Pop();
}
}

括号匹配

算法思想:如果括号序列不为空,重复步骤 1。

步骤 1:从括号序列中取出 1 个括号,分为三种情况:

a)    如果栈为空,则将括号入栈;

b)    如果括号与栈顶的括号匹配,则将栈顶括号出栈。

c)    如果括号与栈顶的括号不匹配,则将括号入栈。

步骤 2:如果括号序列为空并且栈为空则括号匹配,否则不匹配。

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin-top:0cm;
mso-para-margin-right:0cm;
mso-para-margin-bottom:10.0pt;
mso-para-margin-left:0cm;
line-height:115%;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}

用顺序栈实现算法:

    public bool MatchBracket(char[] charlist)
{
SeqStack<char> s = new SeqStack<char>();
int len = charlist.Length;
for (int i = ; i < len; ++i)
{
if (s.IsEmpty())
{
s.Push(charlist[i]);
}
else if(((s.GetTop()=="(")&&(charlist[i]==")")))||(s.GetTop()=="[" && charlist[i]=="]"))
{
s.Pop();
}
else
{
s.Push(charlist[i]);
}
} if (s.IsEmpty())
{
return true;
}
else
{
return false;
}
}

MatchBracket(char[] charlist)

 队列(Queue)是插入操作限定在表的尾部,其它操作限定在表的头部进行的线性表。

队列的操作主要包括:在队尾插入元素、在队头删除元素、取队头元素和判断队列是否为空等。

队列“队尾入 队头出”的操作造成“假溢出”,解决假溢出的方法:将顺序队列看成是首尾相接的循环结构,头尾指示器的关系不变,这种队列叫循环顺序队列。

front 表示队头,front 的范围是 0 到 maxsize-1。 rear 表示队尾,rear 的范围也是 0 到 maxsize-1。

如果循环顺序队列为空,front=rear=-1。 当执行入队列操作时需要判断循环顺序队列是否已满。

如果循环顺序队列已满, (rear  +  1)  %  maxsize==front ,循环顺序队列已满不能插入元素。

求循环队列中数据元素的个数:(rear-front+maxsize)%maxsize

循环顺序队列类 CSeqQueue<T>的实现:

public class CSeqQueue<T> : IQueue<T>
{
private int maxsize; //循环顺序队列的容量
private T[] data; //数组,用于存储循环顺序队列中的数据元素
private int front; //指示循环顺序队列的队头
private int rear; //指示循环顺序队列的队尾 //索引器
public T this[int index]
{
get { return data[index]; }
set { data[index] = value; }
}
//容量属性
public int MaxSize
{
get { return maxsize; }
set { maxsize = value; }
}
//队头属性
public int Front
{
get { return front; }
set { front = value; }
}
//队尾属性
public int Rear
{
get { return rear; }
set { rear = value; }
}
//构造器
public CSeqQueue(int size)
{
data = new T[size];
maxsize = size;
front = rear = -;
}
//求循环队列长度
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 In(T item)
{
if (IsFull())
{
return;
}
else
{
data[++rear] = item;
}
}
//出队
public T Out()
{
T tmp = default(T);
if (IsEmpty())
{
return tmp;
}
tmp = data[++front];
return tmp;
}
//获取队头数据元素
public T GetFront()
{
if (IsEmpty())
{
return default(T);
}
return data[++front];
}
}

CSeqQueue

链队列

队列结点类(Node<T>)的实现:

    public class Node<T>
{
private T data; //数据域
private Node<T> next; //引用域
//构造器
public Node(T val, Node<T> p)
{
data = val;
next = p;
}
//构造器
public Node(Node<T> p)
{
next = p;
}
//构造器
public Node(T val)
{
data = val;
next = null;
}
//构造器
public Node()
{
data = default(T);
next = null;
}
//数据域属性
public T Data
{
get { return data; }
set { data = value; }
}
//引用域属性
public Node<T> Next
{
get { return next; }
set { next = value; }
}
}

Node

链队列类 LinkQueue<T>的实现:

    public class LinkQueue<T> : IQueue<T>
{
private Node<T> front; //队列头指示器
private Node<T> rear; //队列尾指示器
private int num; //队列结点个数
//队头属性
public Node<T> Front
{
get{return front;}
set{front=value;}
}
//队尾属性
public int Rear
{
get { return rear; }
set { rear = value; }
}
//结点的个数
public int Num
{
get{return num;}
set{num=value;}
}
//构造器
public LinkQueue(int size)
{
front=rear=-;
num=;
}
//求循环队列长度
public int GetLength()
{
return num;
}
//清空循环队列
public void Clear()
{
front = rear = null;
num=;
}
//判断循环队列是否为空
public bool IsEmpty()
{
if (front == rear)&&(num==)
{
return true;
}
else
{
return false;
}
}
//入队
public void In(T item)
{
Node<T> q = new Node<T>(item);
if (rear == null)
{
rear=q;
}
else
{
rear.Next=q;
rear=q;
}
++num;
}
//出队
public T Out()
{
if (IsEmpty())
{
return default(T);
}
Node<T> p = front;
front = front.Next;
if(front == null)
{
rear=null;
}
--num;
return p.Data;
}
//获取队头数据元素
public T GetFront()
{
if (IsEmpty())
{
return default(T);
}
return front.Data;
}
}

LinkQueue

判断一个字符串是否是回文:采用循环顺序队列和顺序栈 来实现

    public bool Main()
{
SeqStack<char> s = new SeqStack<char>();
CSeqQueue<char> q = new CSeqQueue<char>();
string str = Console.ReadLine();
for(int i = ; i < str.Length; ++i)
{
s.Push(str[i]);
q.In(str[i]);
}
while(!s.IsEmpty() && !q.IsEmpty())
{
if(s.Pop() != q.Out())
{
return false;
}
}
return true;
}

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin-top:0cm;
mso-para-margin-right:0cm;
mso-para-margin-bottom:10.0pt;
mso-para-margin-left:0cm;
line-height:115%;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}

C#数据结构_栈和队列的更多相关文章

  1. 学习javascript数据结构(一)——栈和队列

    前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...

  2. python数据结构之栈与队列

    python数据结构之栈与队列 用list实现堆栈stack 堆栈:后进先出 如何进?用append 如何出?用pop() >>> >>> stack = [3, ...

  3. JS数据结构的栈和队列操作

    数据结构:列表.栈.队列.链表.字典.散列.图和二叉查找树! 排序算法:冒牌.选择.插入.希尔.归并和快速! 查找算法:顺序查找和二分查找 在平时工作中,对数组的操作很是平常,它提供了很多方法使用,比 ...

  4. [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)

    再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...

  5. python数据结构之栈、队列的实现

    这个在官网中list支持,有实现. 补充一下栈,队列的特性: 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIF ...

  6. PHP数据结构:栈、队列、堆、固定数组

    数据结构:栈 队列: 堆: 固定尺寸的数组:

  7. 算法与数据结构(二) 栈与队列的线性和链式表示(Swift版)

    数据结构中的栈与队列还是经常使用的,栈与队列其实就是线性表的一种应用.因为线性队列分为顺序存储和链式存储,所以栈可以分为链栈和顺序栈,队列也可分为顺序队列和链队列.本篇博客其实就是<数据结构之线 ...

  8. 数据结构之栈和队列及其Java实现

    栈和队列是数据结构中非常常见和基础的线性表,在某些场合栈和队列使用很多,因此本篇主要介绍栈和队列,并用Java实现基本的栈和队列,同时用栈和队列相互实现. 栈:栈是一种基于“后进先出”策略的线性表.在 ...

  9. python——python数据结构之栈、队列的实现

    这个在官网中list支持,有实现. 补充一下栈,队列的特性: 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIF ...

随机推荐

  1. 端口,OSI7层模型,TCP的三次握手和四次挥手,进度条

    1.端口: 端口是为了将同一个电脑上的不同程序进行隔离 IP是找电脑,端口是找电脑上的程序 MySQL是一个软件,帮助我们在硬盘上进行文件操作,默认端口是3306 Redis是一个软件,帮助我们在内存 ...

  2. 【git】Github上面的开源代码怎么在本地编译运行

    最近才发现Github是一个好东西,可以从上面学到很多东西,不说了,赶快写完去学习去... 1.首先你可以看看这个开源项目的README.md,一般一般这里都会有项目的使用方式以及一些注意的点 2.你 ...

  3. JVM执行原理

    ,Java是一种技术,它由四方面组成:Java编程语言.Java类文件格式.Java虚拟机和Java应用程序接口(Java API).它们的关系如下图所示: 运行期环境代表着Java平台,开发人员编写 ...

  4. bean的创建(五)第三部分 bean工厂方法参数的解析

    准备好一系列参数之后,开始参数类型的转换,方法参数的对应. ConstructorResolver.createArgumentArray private ArgumentsHolder create ...

  5. iOS开发 8小时时差问题

    今天调试遇到时间计算的问题,发现怎么算都会有差别,后来仔细观察,发现有8小时的时差…… 这篇文章解释的很好,用到了,因此记之. ios有关时间打印出来差8小时的问题

  6. poj 3714 寻找最近点对

    参考自<编程之美>169页,大概原理就是把区间分成两部分,然后递归找每一部分中最近的点对,还有一种情况就是这个点对分属于这两部分,然后选两部分中的部分点枚举即可,取其最小值. //2013 ...

  7. C++实现反射

    之前碰到过一个问题,C++中如何通过一个字符串生成一个类. C++是不支持通过类名称字符串”ClassXX”来生成对象的,也就是说我们可以使用 new ClassXX 来生成对象,但是不能通过 new ...

  8. 搭建nexus私服

    一.安装 1.从网上下载nexus软件https://www.sonatype.com/download-oss-sonatype  下载Nexus Repository Manager OSS软件包 ...

  9. python创建虚拟环境(Windows)

    >>>构建Python虚拟环境的目的是为了防止真实环境被破坏!!! >>>每一个项目建议用一个虚拟环境为了防止软件版本号冲突!!! 1.在终端切换到一个新的磁盘 如 ...

  10. Linux基础文件类型

    一.文件时间 ls -l 文件名 仅看的是文件的修改时间 [root@linux ~]# ls -l /etc/passwd -rw-r--r-- root root 5月 : /etc/passwd ...