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 ...
随机推荐
- 11.vim编辑器命令
VI中的多行删除与复制 方法一: 单行删除,:1(待删除行)d 多行删除 ,:1,10d 方法二: 光标所在行,dd 光标所在行以下的N行,Ndd 方法1: 光标放到第6行, 输入:2yy ...
- JS 事件 Event
注册事件 target.addEventListener(type, listener, options); 或者 target.addEventListener(type, listener, us ...
- nginx 虚拟主机、反向代理服务器及负载均衡,多台主机分离php-fpm实验
一.简介 本章介绍一些架构原理基础知识, 1.1.LNMP及php-fpm 请参考https://www.cnblogs.com/zhangxingeng/p/10242902.html 1.2.透明 ...
- hive案例
数据倾斜: 操作• Join on a.id=b.id• Group by• Count Distinct count(groupby)• 原因• key分布不均导致的• 人为的建表疏忽• 业务数据特 ...
- vue:监听数据
1:普通的监听: data () { return { watchNum:1, } }, watch: { watchNum(newValue, oldValue) { console.log(old ...
- C#new出来的结构体内存分配在堆上
如题,有同事说因为结构体是值类型,所以 new出来的也是分配在栈上的.我的直觉是但凡使用new的东西都在堆上分配内存,除非C#对结构体做了特殊处理. new int[10]这个说明不了什么,因为数组是 ...
- ReactiveX 学习笔记(11)对 LINQ 的扩展
Interactive Extensions(Ix) 本文的主题为对 Ix 库,对 LINQ 的扩展. Buffer Ix.NET Buffer Ix.NET BufferTest Buffer 方法 ...
- zstack使用笔记之端口转发
根据官方教程,使用端口转发,可以把公网流量转发到内网 实验环境是这样的 公网网段:172.17.3.x 内网网段:192.168.1.x 首先创建云路由网络,这个就不说了,根据教程大家都可以创建出来, ...
- 24 week 4 安装 docker
安装docker 出现问题 解决办法https://blog.csdn.net/VOlsenBerg/article/details/70140211 发现链接超时,然后就https://blog.c ...
- python第三步骤(pygame)
1:先安装homebrew(类似于yum /apt-get为什么需要它呢,因为pip安装的时候需要很多的包的依赖,sdl什么的), 2:pip 安装pygame 我讨厌的环境变量问题 然后 通过的是 ...