C#实现栈
概述
先用C#实现一个栈的类,如下:
public class MyStack<T> : IEnumerable<T>, IDisposable
{
private int _top = ;
private int _size = ;
private T[] _stack = null; public int Top {
get {
return _top;
}
} public int Size {
get {
return _size;
}
} public int Length {
get {
return _top;
}
} public T this[int index] {
get {
return _stack[index];
}
} public MyStack(int size) {
_size = size;
_top = ;
_stack = new T[size];
} public bool IsEmpty() {
return _top == ;
} public bool IsFull() {
return _top == _size;
} public void Clear() {
_top = ;
} /// <summary>
/// 入栈
/// </summary>
/// <param name="node"></param>
/// <returns></returns>
public bool Push(T node) {
if (!IsFull()) {
_stack[_top] = node;
_top++;
return true;
}
return false;
} /// <summary>
/// 出栈
/// </summary>
/// <returns></returns>
public T Pop() {
T node = default(T);
if (!IsEmpty()) {
_top--;
node = _stack[_top];
}
return node;
} public void Traverse() {
for(int i = ; i < _top; i++) {
Console.WriteLine(_stack[i]);
}
} public IEnumerator<T> GetEnumerator() {
for(int i = ; i < _stack.Length; i++) {
if(_stack[i] != null) {
yield return _stack[i];
}
}
} IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
} public void Dispose() {
_stack = null;
}
}
上面要注意的是入栈时,是直接把值赋给栈顶,然后再将栈顶加1,出栈的时候,先将栈顶减一,再出栈,切记。
实例一:
用栈来实现进制转换,即十进制转化为2进制、8进制、16进制,代码如下:
/// <summary>
/// 十进制转换为其他进制
/// </summary>
/// <param name="number">要转换的数字</param>
/// <param name="target">目标进制</param>
/// <returns></returns>
public static string Process(int number, int target) {
string result = string.Empty;
string format = "0123456789ABCDEF";
MyStack<int> stack = new MyStack<int>();
int mod = ;
while(number != ) {
mod = number % target;
stack.Push(mod);
number = number / target;
}
while (!stack.IsEmpty()) {
int pos = stack.Pop();
result += format[pos];
}
return result;
}
测试代码:
string slt = MoronicConvert.Process(, );
Console.WriteLine(slt);
运行结果:

实例二
用栈来检查一个字符串括号是否配对,代码如下:
/// <summary>
/// 检查字符串中括号是否成对匹配
/// </summary>
/// <param name="charter">待检查的字符串</param>
/// <returns></returns>
public static bool Check(string charter) {
bool result = false;
MyStack<char> stack = new MyStack<char>();
MyStack<char> needStack = new MyStack<char>();
char currentNeed = '';
for (int i = ; i < charter.Length; i++) {
if(charter[i] != currentNeed) {
char t = charter[i];
stack.Push(t);
switch (t) {
case '[':
if(currentNeed != '') {
needStack.Push(currentNeed);
}
currentNeed = ']';
break;
case '(':
if(currentNeed != '') {
needStack.Push(currentNeed);
}
currentNeed = ')';
break;
case '{':
if (currentNeed != '') {
needStack.Push(currentNeed);
}
currentNeed = '}';
break;
}
}
else {
stack.Pop();
currentNeed = needStack.Pop();
}
}
if (stack.IsEmpty()) {
result = true;
}
return result;
}
测试代码:
bool check = SpellCheck.Check("[[([)]]]");
Console.WriteLine(check.ToString());
运行结果:

总结:
希望能帮到你,望推荐!
C#实现栈的更多相关文章
- 通往全栈工程师的捷径 —— react
腾讯Bugly特约作者: 左明 首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的 ...
- Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)
--reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...
- duang~免费的学习视频来啦:学霸君之全栈测试
学霸君向童鞋们推荐一款 同名学霸学习 视频教程 重点是完全免费收看学习噢!!! 今天 学霸君推荐腾讯课堂的学霸君之全栈测试 复制下方链接至腾讯课堂中报名学习 https://ke.qq.com/cou ...
- [数据结构]——链表(list)、队列(queue)和栈(stack)
在前面几篇博文中曾经提到链表(list).队列(queue)和(stack),为了更加系统化,这里统一介绍着三种数据结构及相应实现. 1)链表 首先回想一下基本的数据类型,当需要存储多个相同类型的数据 ...
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8748 Solved: 3835[Submi ...
- BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]
4453: cys就是要拿英魂! Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 90 Solved: 46[Submit][Status][Discu ...
- BZOJ 3238: [Ahoi2013]差异 [后缀数组 单调栈]
3238: [Ahoi2013]差异 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2326 Solved: 1054[Submit][Status ...
- .NET全栈开发工程师学习路径
PS:最近一直反复地看博客园以前发布的一条.NET全栈开发工程师的招聘启事,觉得这是我看过最有创意也最朴实的一个招聘启事,更为重要的是它更像是一个技术提纲,能够指引我们的学习和提升,现在转载过来与各位 ...
- Nodejs之MEAN栈开发(八)---- 用户认证与会话管理详解
用户认证与会话管理基本上是每个网站必备的一个功能.在Asp.net下做的比较多,大体的思路都是先根据用户提供的用户名和密码到数据库找到用户信息,然后校验,校验成功之后记住用户的姓名和相关信息,这个信息 ...
- 匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置
0x00 前言: 匹夫在日常和别人交流的时候,常常会发现一旦讨论涉及到“类型”,话题的热度就会立马升温,因为很多似是而非.或者片面的概念常常被人们当做是全面和正确的答案.加之最近在园子看到有人翻译的& ...
随机推荐
- 转:CI引入外部js与css
其实不管是在用CI还是ZF都有同样一个问题,就是路径的问题.前期,我在用ZF做CMS时,我在.htaccess文件中设置了如遇到js,css,img等资源文件都不重定向.但今天在用CI时,却忘记了,搞 ...
- hdu3483之二项式展开+矩阵快速幂
A Very Simple Problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- [置顶] 使用红孩儿工具箱完成基于Cocos2d-x的简单游戏动画界面
[Cocos2d-x相关教程来源于红孩儿的游戏编程之路CSDN博客地址:http://blog.csdn.net/honghaier 红孩儿Cocos2d-X学习园地QQ3群:205100149,47 ...
- 安装apk程序进android
package com.example.installmyapk; import java.io.File; import android.net.Uri; import android.os.Bun ...
- LVS--什么是LVS?
1.什么是LVS? 首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术.调度器具有很 ...
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序)
原文:WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序) 基于HTTP-GET的元数据发布方式与基于WS-MEX原理类似,但是ServiceMetad ...
- [WPF源代码]QQ空间相册下载工具
放一个WPF源代码,源代码地址 http://download.csdn.net/detail/witch_soya/6195987 代码没多少技术含量,就是用WPF做的一个QQ空间相册下载工具,效果 ...
- highcharts dynamic change line color
mouseOut: function(){ this.series.graph.attr({"stroke","#ccc"}) }
- [置顶] 殊途同归——总结asp.net
怀着期望,忐忑的心情看完了asp.net的一部分视频,这部分的学习也到了一个段落,颗粒归仓的工作还是要做的,但是有什么比一张图来得更直观有效呢? 先来张图,这次真的是有图有真相: 通过asp.net的 ...
- cocos2d-x环境的搭建之xcode-本人亲历成功搭建!
cocos2d-x环境的搭建之xcode-本人亲历成功搭建! 写给大家的前言,在学习cocos2d-x的时候自己走了很多的弯路,也遇到了很多很多问题,不管是简单的还是困难的现在都慢慢的一步一步克服了, ...