您的位置 首页 芯闻

栈的经典运用

栈是计算机术语中比较重要的概念,实质上栈就是一段内存区域,但是栈满足一定的特性,那就是只有一个口,具有先入后出的特性,这种特性在计

栈是计算机术语中比较重要的概念,实质上栈便是一段内存区域,可是栈满意必定的特性,那便是只需一个口,具有先入后出的特性,这种特性在计算机中有很广泛的运用。其实在程序员无时无刻不在运用栈,函数的调用是咱们直接运用栈的最好比方,因而能够说栈的一个最重要的运用便是函数的调用。可是栈的运用还不止这些,还有许多,其间几个典型的运转如下:判别平衡符号,完成表达式的求值(也便是中缀表达式转后缀表达式的问题以及后缀表达式求值问题),在路劲探究中完成路劲的保存也能够说是栈的经典运用之一。详细的问题详细分析,只需满意先入后出特性的问题都能找到现成的数据结构—栈。

本文选用C++中的vector完成栈结构,然后使用栈完成判别平衡符号,完成中缀表达式到后缀表达式的转化,并根据栈完成简略的整数加减乘除运算。

首要栈的完成,因为在C++中选用了vector来替代原始的数组操作,这种比较便利的容器能较好的完成数组的功用,当然栈也能够选用链表完成,可是我以为链表没有数组直观,并且在实践的计算机里也是选用接连的存储空间作为栈空间的,因而挑选Vector。首要完成三个操作,push、pop以及为空判别。根本的方法如下:

#ifndef __MYSTACK_H_H_
#define __MYSTACK_H_H_

#include “myvector.h”

namespace myspace
{
template
class Stack
{
public:
Stack(){}
void push(const Object &x)
{
objects.push_back(x);
}

const Object &pop()
{
int len;
if(!isempty())
{
objects.pop_back();
len = objects.size();
return objects[len];
}
}

bool isempty()const
{
return (objects.size() == 0);
}

int size()
{
return objects.size();
}
private:
Vector objects;
};
}

#endif

完成了简略的栈类,接下来选用栈完成一些简略的运用。

符号的平衡问题
在语言中往往需求判别一些符号是否是成对呈现的,比方<>,{},[],(),通常在C++中也只需这几种对称问题,怎么让判别符号的对称也是许多代码判别的首要任务。当然完成的方法是多种多样的,选用栈的完成会相对愈加简略。根本的完成思路如下:
假设在读入一串字符串今后,假如遇到对称符号的左面部分,则将其压入栈中,当遇到对称符号的右边部分,则弹出栈中的一个目标,完成比对,假如是对称的,则阐明当时的符号是平衡的,假如不对称,则阐明当时字符串是不平衡的,当字符串读完今后,假如一切的符号都是平衡的,栈中此刻应该便是为空,经过判别栈中是否为空,阐明字符串是否是符号平衡的。
根据上面完成的栈类,完成符号平衡判别的进程比较简略,如下所示:

bool isbalance(const string &str)
{
string::size_type len = str.size();

Stack stack;

for(string::size_type i = 0; i < len ; ++ i)
{
/*first selection*/
if(str[i] == [ || str[i] == { ||
str[i] == ( || str[i] == <)
{
stack.push(str[i]);
}
/*假如是对称的符号,则从栈中弹出*/
if(str[i] == ] || str[i] == } ||
str[i] == ) || str[i] == >)
{
/*假如栈中没有目标,则阐明不平衡*/
if(stack.isempty())
{
cout << "the string is Unblanced" << endl;
return false;
}
/*选用switch-case句子判别*/
switch(str[i])
{
case ]:
{
/*判别是否是匹配的*/
if([ != stack.pop())
{
cout << "Can not blanced with ]" << endl;
return false;
}
break;
}
case ):
{
if(( != stack.pop())
{
cout << "Can not blanced with )" << endl;
return false;
}
break;
}
case }:
{
if({ != stack.pop())
{
cout << "Can not blanced with }" << endl;
return false;
}
break;
}
case >:
{
if(< != stack.pop())
{
cout << "Can not blanced with >” << endl;
return false;
}
break;
}
/*一般的非对称字符*/
default:
break;
}
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/317746.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们