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 ...
随机推荐
- H5视频推流方案
导语 随着直播平台爆发式增长,直播平台从 PC 端转战移动端,紧跟着直播的潮流,自己学习实现了一套简单的 H5 视频推流的解决方案,下面就给小伙伴们分享一下自己学习过程中的经验. 环境部署 1. 配置 ...
- charles抓包的安装,使用说明以及常见问题解决(windows)
charles抓包的安装,使用说明以及常见问题解决(windows) https://blog.csdn.net/zhangxiang_1102/article/details/77855548
- DOS 格式化日期时间输出
if "%date:~5,2%" lss "10" (set mm=0%date:~6,1%) else (set mm=%date:~5,2%)if &quo ...
- iframe+form表单提交数据
<h6>基于iframe+Form表单</h6> <iframe id="iframe" name="ifra" onclick= ...
- eclipse中导入java类失败的问题
在 Eclips 开发时,新建了一个 Dynamic Web Project,在运行jsp文件时tomcat报错: org.apache.jasper.JasperException: Unable ...
- 基于官方镜像MySQL做自定义业务扩充镜像
转自:https://www.cnblogs.com/jsonhc/p/7809571.html 首先从https://hub.docker.com/_/mysql/拉取官方镜像,如果速度缓慢,建议添 ...
- 服务发现 - consul 的介绍、部署和使用(转)
什么是服务发现 相关源码: spring cloud demo 微服务的框架体系中,服务发现是不能不提的一个模块.我相信了解或者熟悉微服务的童鞋应该都知道它的重要性.这里我只是简单的提一下,毕竟这不是 ...
- Haskell语言学习笔记(82)Extensible effects
安装 extensible-effects $ cabal install extensible-effects Installed extensible-effects-3.0.0.0 Extens ...
- 深入jUI(DWZ)
-----------------------------------------------------------------------------主页面index.html <html& ...
- JAVAWEB 一一框架整合(SSI : Spring+SpringMVC+ ibtis)
web.xml applicationContext.xml springmvc-servlet.xml UserController package com.ssi.controller; impo ...