STL-stack和顺序栈实现括号匹配
2018-11-11-14:28:31
1.顺序栈
下面是我用数组实现的顺序栈,包含的函数有出入栈,查看栈顶元素,栈的大小,栈是否空等函数,当栈空间不够用时,对应的数组会自动增长。
/*********************************************************
顺序栈实现括号匹配。
main函数操作:
1.在这里main函数内部主要以解决括号匹配问题。
2.本例中包含"()""[]"{}"三种括号。
3.输入一个表达式,如果括号匹配则输出True,否则输出False。
**********************************************************/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
using namespace std;
typedef char SElemtype;
#define INITSTACKSIZE 100
#define STACKINCRESMENT 40
#define OverFlow -1
typedef struct {
SElemtype*Top;//指向栈顶
SElemtype*Base;//指向栈底
int Stacksize;//以sizeof(SElemtype)为单位
}Stack; bool InitStack(Stack&S);
bool StackEmpty(Stack S);
int StackLength(Stack S);
bool GetTop(Stack S,SElemtype&Elem);
bool Push(Stack&S,SElemtype Elem);
bool Pop(Stack&S,SElemtype&Elem);
bool PrintStack(Stack S);
//main函数内所有数据均为测试数据,读者可根据自己测试方式自行调换 int main()
{
Stack S;
InitStack(S);
char c;
string str;
cin>>str;
for(int i=;i<str.length();i++){
if(str[i]=='('||str[i]=='['||str[i]=='{'){
Push(S,str[i]);
continue;
}
if(str[i]==')'){
GetTop(S,c);
if(c=='(') Pop(S,c);
if(c=='['||c=='{') break;
}
if(str[i]==']'){
GetTop(S,c);
if(c=='[') Pop(S,c);
if(c=='('||c=='{') break;
}
if(str[i]=='}'){
GetTop(S,c);
if(c=='{') Pop(S,c);
if(c=='('||c=='[') break;
}
}
if(StackEmpty(S))
cout<<"True"<<endl;
else
cout<<"False"<<endl;
return ;
}
bool InitStack(Stack&S){
S.Base=(SElemtype*)malloc(INITSTACKSIZE*sizeof(SElemtype));
if(!S.Base)
exit(OverFlow);//程序异常终止
S.Top=S.Base;
S.Stacksize=INITSTACKSIZE;
return true;
} bool StackEmpty(Stack S){
if(S.Top==S.Base)
return true;
else
return false;
} int StackLength(Stack S){
int Length=;
SElemtype*index;
for(index=S.Top;index!=S.Base;index--)
Length++;
return Length;
} bool GetTop(Stack S,SElemtype&Elem){
if(S.Top==S.Base)
return false;
else{
Elem=*(S.Top-);
return true;
}
} bool Push(Stack&S,SElemtype Elem){
if(S.Top-S.Base>=S.Stacksize){
S.Base=(SElemtype*)realloc(S.Base,(S.Stacksize+STACKINCRESMENT)*sizeof(SElemtype));
if(!S.Base)
exit(OverFlow);
S.Top=S.Base+S.Stacksize;
S.Stacksize+=STACKINCRESMENT;
}
*S.Top++=Elem;
return true;
} bool Pop(Stack&S,SElemtype&Elem){
if(S.Base==S.Top)
return false;
else
Elem=*--S.Top;
return true;
} /****************************************
Author:CRUEL_KING
Time:2018/11/10
Program name:顺序栈实现括号匹配.cpp
****************************************/
2.STL之Stack
stack是一种容器适配器(STL的容器分为顺序容器和关联容器,容器适配器,是对这两类容器进行包装得到的具有更强的约束力的容器),被设计来用于操作先进后出(FILO)结构的情景,在这种情况下, 元素的插入和删除都只能在容器的尾部进行。stack通过容器适配器来实现,是一种将特定的容器类作为其最底层的容器的类,它提供了一些特定的成员函数来访问自己的元素,元素只能在这个特定容器的后面,也就是栈的顶部,进行出栈和入栈操作。
构造:template <class T, class Container = deque<T> > class stack;
如上,这对尖括号中有两个参数,第一个是T,表示栈中存放的数据的类型,比如int,double,或者结构体之类。
第二个参数指明底层实现的容器类型,也就是指明这个栈的内部实现方式,比如vector,deque,list。如果不指明它,默认使用deque(双端队列)。
栈的成员函数和基本操作:
1.定义栈
1 stack<data_type>name;//如:stack<int>z;定义一个数据类型为data_type的栈name。
2.复制栈
stack<data_type>name(name2);//如:stack<int>z(z2);将栈name2中的元素复制到一个新栈name中。
3.入栈
name.push(variable);//如:z.push(a);将a压入栈z的顶端。
4.出栈(栈不为空的情况下)
name.pop();//如:z.pop();弹出一个z栈的栈顶元素。
5.查看栈顶元素(栈不为空的情况下)
variable=name.top();//如:k=z.top();将z栈的栈顶元素赋值给一个变量k。
6.栈的元素个数
variable=name.size();//如:k=z.size();将z栈的元素个数赋值给一个变量k。
7.检验栈是否为空
name.empty();//如:z.empty();检验栈是否为空,空返回为1,非空返回为0;
例题详解(括号匹配)
/*********************************************************
STL_Stack栈实现括号匹配。
main函数操作:
1.在这里main函数内部主要以解决括号匹配问题。
2.本例中包含"()""[]"{}"三种括号。
3.输入一个表达式,如果括号匹配则输出True,否则输出False。
**********************************************************/
#include <cstdio>
#include <cstring>
#include <stack>
#include <iostream>
using namespace std; int main()
{
stack <char>S;
char c;
string str;
cin>>str;
for(int i=;i<str.length();i++){
if(str[i]=='('||str[i]=='['||str[i]=='{'){
S.push(str[i]);
continue;
}
if(str[i]==')'){
c=S.top();
if(c=='(') S.pop();
if(c=='['||c=='{') break;
}
if(str[i]==']'){
c=S.top();
if(c=='[') S.pop();
if(c=='('||c=='{') break;
}
if(str[i]=='}'){
c=S.top();
if(c=='{') S.pop();
if(c=='('||c=='[') break;
}
}
if(S.empty())
cout<<"True"<<endl;
else
cout<<"False"<<endl;
return ;
} /****************************************
Author:CRUEL_KING
Time:2018/11/11
Program name:STL栈实现括号匹配.cpp
****************************************/
STL-stack和顺序栈实现括号匹配的更多相关文章
- 利用顺序栈解决括号匹配问题(c++)-- 数据结构
题目: 7-1 括号匹配 (30 分) 给定一串字符,不超过100个字符,可能包括括号.数字.字母.标点符号.空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入格式: 输入在一行 ...
- HDU 4283 You Are the One ★(进出栈的括号匹配性质:区间DP)
题意 有一个队列,每个人有一个愤怒值D,如果他是第K个上场,不开心指数就为(K-1)*D.但是边上有一个小黑屋(一个FILO堆栈),可以一定程度上调整上场程序,求一种安排上场方案使得所有人的不开心指数 ...
- C语言数据结构之栈:括号匹配
括号匹配这是个很简单的题目,如果只有小括号,就模拟进栈和出栈的过程就行了: 注:输入时'@'作为结束标志 #include <stdio.h> int main() { freopen(& ...
- 《LeetBook》leetcode题解(20):Valid Parentheses[E]——栈解决括号匹配问题
我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...
- Python面试题:使用栈处理括号匹配问题
括号匹配是栈应用的一个经典问题, 题目 判断一个文本中的括号是否闭合, 如: text = "({[({{abc}})][{1}]})2([]){({[]})}[]", 判断所有括 ...
- 利用栈实现括号匹配(python语言)
原理: 右括号总是与最近的左括号匹配 --- 栈的后进先出 从左往右遍历字符串,遇到左括号就入栈,遇到右括号时,就出栈一个元素与其配对 当栈为空时,遇到右括号,则此右括号无与之匹配的左括号 当最终右括 ...
- JAVA栈实例—括号匹配
import java.util.Stack; public class test { public static void main(String[] args){ System.out.print ...
- 栈之括号匹配问题(java实现)
假设表达式中只允许两种括号:().{}:正确表达顺序为:()或{}或({})或{({}{})}的形势:如{(}或(})或({)}的表达形势均不对.算法的设计思想: 出现左括弧则进栈: 出现右括弧则首先 ...
- Python 用栈判断括号匹配
#!/usr/bin/python # -*- coding: UTF-8 -*- from pythonds.basic.stack import Stack def parChecker(symb ...
随机推荐
- ubuntu16.04搭建geodjango+postgresql+postgis的WebGIS框架(一)安装第三方空间库
postgis是postgresql的空间扩展对象,它需要一些第三方库的支持.包括GEOS, PROJ.4 和 GDAL.我们首先安装这几个空间库. 在ubuntu系统终端执行:(预先装一些依赖的库) ...
- 查看进程中的socket状态和数量
程序运行时查看,结果是这样子的 C:\Users\Administrator>netstat -ano|findstr TCP TIME_WAIT TCP TIME_WAIT TCP TIME_ ...
- day18-列表生成式、迭代器
1.列表生成式,也叫列表推导式 即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式.优点:构造简单,一行完成缺点:不能排错,不能构建复杂的数据结 ...
- MySQL主从同步机制及同步中的问题处理
http://www.drupal001.com/2012/03/mysql-master-slave-troubles/ http://www.jb51.net/article/33052.htm
- css样式表2
<head> <style type="text/css"> .main { height:42px; width:100%; text-align:cen ...
- js 引入外部文件之 script 标签
在我的理解看来,html 就是一个单纯的管显示问题,js就是单纯的管动作问题,css就是单纯的管布局问题,这三个构成了一个网页 在HTML中,经常会用到引入js 文件. 引入js的方法很简单: 1. ...
- Spark读取配置(转)
转自:https://github.com/keepsimplefocus/spark-sourcecodes-analysis/blob/master/markdowns/Spark%E8%AF%B ...
- ORA-01078和LRM-00109问题导致ORACLE启动失败解决方法
操作环境 SuSE11sp3 + ORACLE11gR2(11.2.0.3) 问题现象 新安装的ORACLE启动失败,提示ORA-01078和LRM-00109错误.具体错误现象如下 SQL> ...
- openwrt用WEB刷固件型号不对问题强行处理
参照这里:https://blog.csdn.net/caoshunxin01/article/details/79355602 原机是一块mt7620A的通板,之前刷了一个叫WE826型号的固件,发 ...
- jquery 初始化数据 添加html 第一次玩0.0
/** * Created by Eee_xiang on 2018/04/12. * 联动响应事件 */ (function () { $.linkEvent = function (options ...