相信大家对栈这个名词都是有一些了解的。但是具体什么是栈呢?栈的作用?我们先来看一下百度百科给的解释:
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底,栈底固定,而站顶浮动,当栈中元素个数为零时称这个栈为空栈。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。所谓“栈”者,货物的中转站也,可以引申为仓库。所以引用到计算机领域里面,就是指数据暂时存储的地方,所以才会有进栈啊、出栈的说法。
首先系统或者数据结构栈中数据类容的读取与插入(入栈push和出栈pop)是两回事,差入是增加数据,弹出是删除数据。这些操作只能从栈顶元素操作,但是读取栈中元素是没有任何约束的,也就是说可以读取栈中的任何元素。
系统栈在计算机体系结构中又起到一个跨部件交互的媒介区域的作用,也就是cpu与内存的交流通道,cpu只从系统给我们自己编写的应用程序所规定的栈入口线性的读取执行指令,用一个形象的词来形容它就是管道线、流水线。
栈在程序运行的过程中起着很大的作用。最重要的是栈保存了函数调用时所需要维护的信息,这常常被称为堆栈帧或者活动记录。堆栈帧一般包括以下两个方面的信息:
1.函数的返回地址和参数。
2.临时变量:包含函数的非晶态局部变量以及编辑器自动生成的其他变量。
栈分为顺序栈和链式栈,基本的算法有:进栈push,获取栈顶元素peek,出栈pop等等。我们通常会用栈来解决括号匹配问题,如一下代码实现了判断括号是否匹配。
static void Main(string[] args)
{
Console.ForegroundColor = ConsoleColor.Green;
string st = "([()[](()){}])";
if (Stack(st))
{
Console.WriteLine("括号匹配");
}
else
{
Console.WriteLine("括号不匹配");
}
Console.ReadKey();
}
public static bool Stack(string st)
{
Stack<char> newsatck = new Stack<char>();
foreach (char i in st)
{
switch(i)
{
case '(':
newsatck.Push(i);
break;
case '[':
newsatck.Push(i);
break;
case '{':
newsatck.Push(i);
break;
case ')':
if ( newsatck.Peek() == '(')
{
newsatck.Pop();
}
else
{
newsatck.Push(i);
}
break;
case ']':
if ( newsatck.Peek() == '[')
{
newsatck.Pop();
}
else
{
newsatck.Push(i);
}
break;
case '}':
if ( newsatck.Peek() == '{')
{
newsatck.Pop();
}
else
{
newsatck.Push(i);
}
break;
}
}
if (newsatck.Count==0)
{
return true;
}
else
{
return false;
}
}