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 ...
随机推荐
- k8s资料转载
K8S入门(二) kubeadmin单机部署 (kubernetes)k8s入门.yum单机版安装.kuberctl指令.k8s服务实例. kubernetes---CentOS7安装kubernet ...
- MySQL(Innodb)索引的原理
引言 回想四年前,我在学习mysql的索引这块的时候,老师在讲索引的时候,是像下面这么说的 索引就像一本书的目录.而当用户通过索引查找数据时,就好比用户通过目录查询某章节的某个知识点.这样就帮助用户有 ...
- react-navigation设置navigationOptions中Static中使用 this 的方法
使用react-navigation时,单页面设置navigationOptions中,进行Static中 调用this 中的方法或值时,需要做如下操作 static navigationOption ...
- SpringBoot配置swagger2(亲测有效,如果没有配置成功,欢迎在下方留言)
一.导包: <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swa ...
- 关于GC.Collect在不同机器上表现不一致问题
2019.1.17,昨天项目更新后策划反应: 游戏卡,表现为:每走几步就卡一下.前天还没有. 但在我本机测试中,却没有任何卡顿感. QC同学的机器也卡.我去看了下,打开Profiler,没开deep, ...
- linux下安装Tomcat7.0
1.下载安装文件:Download apache-tomcat-7.0.14.tar.gz 下载1 下载 2.输入命令解压文件:tar - zxvf apach ...
- ReactiveX 学习笔记(6)条件操作符
Conditional and Boolean Operators 本文的主题为处理 Observable 的条件和布尔操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操 ...
- monkey压力测试
压力测试: monkey -p com.qihu360.mobilesafe -v -p 后面跟包名 : -v 后面跟次数: 通过观察log日志,查看应用中出现的问题. =============== ...
- 简单全局HOOK拦截大部分键盘消息
前言:学习HOOK中,万一老师讲解HOOK入门教程:http://www.cnblogs.com/del/category/124150.html http://www.cnblogs.com/del ...
- SQL左外连接
第一篇写在网络上的笔记 左外连接 select a.*,b.* from a left join b on a与b的连接条件; 先展示left join关键字左边的a表中的所有数据,根据条件关联查询l ...