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和顺序栈实现括号匹配的更多相关文章

  1. 利用顺序栈解决括号匹配问题(c++)-- 数据结构

    题目: 7-1 括号匹配 (30 分)   给定一串字符,不超过100个字符,可能包括括号.数字.字母.标点符号.空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入格式: 输入在一行 ...

  2. HDU 4283 You Are the One ★(进出栈的括号匹配性质:区间DP)

    题意 有一个队列,每个人有一个愤怒值D,如果他是第K个上场,不开心指数就为(K-1)*D.但是边上有一个小黑屋(一个FILO堆栈),可以一定程度上调整上场程序,求一种安排上场方案使得所有人的不开心指数 ...

  3. C语言数据结构之栈:括号匹配

    括号匹配这是个很简单的题目,如果只有小括号,就模拟进栈和出栈的过程就行了: 注:输入时'@'作为结束标志 #include <stdio.h> int main() { freopen(& ...

  4. 《LeetBook》leetcode题解(20):Valid Parentheses[E]——栈解决括号匹配问题

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  5. Python面试题:使用栈处理括号匹配问题

    括号匹配是栈应用的一个经典问题, 题目 判断一个文本中的括号是否闭合, 如: text = "({[({{abc}})][{1}]})2([]){({[]})}[]", 判断所有括 ...

  6. 利用栈实现括号匹配(python语言)

    原理: 右括号总是与最近的左括号匹配 --- 栈的后进先出 从左往右遍历字符串,遇到左括号就入栈,遇到右括号时,就出栈一个元素与其配对 当栈为空时,遇到右括号,则此右括号无与之匹配的左括号 当最终右括 ...

  7. JAVA栈实例—括号匹配

    import java.util.Stack; public class test { public static void main(String[] args){ System.out.print ...

  8. 栈之括号匹配问题(java实现)

    假设表达式中只允许两种括号:().{}:正确表达顺序为:()或{}或({})或{({}{})}的形势:如{(}或(})或({)}的表达形势均不对.算法的设计思想: 出现左括弧则进栈: 出现右括弧则首先 ...

  9. Python 用栈判断括号匹配

    #!/usr/bin/python # -*- coding: UTF-8 -*- from pythonds.basic.stack import Stack def parChecker(symb ...

随机推荐

  1. 机器学习进阶-案例实战-图像全景拼接-书籍SIFT特征点连接 1.cv2.drawMatches(对两个图像的关键点进行连线操作)

    1.cv2.drawMatches(imageA, kpsA, imageB, kpsB, matches[:10], None, flags=2)  # 对两个图像关键点进行连线操作 参数说明:im ...

  2. centos服务器如何用命令查看哪个程序内存占用情况,硬盘空间占用

    1.free -m只能查看内存总量情况 2.top M ( 注意M是大写) 3.ps aux|head -1; ps aux | sort -k4nr | head -10 ------------- ...

  3. Git实用教程

    http://iissnan.com/progit/html/zh/ch2_2.html

  4. EF 配置MySQL

    添加 mysql dll 引用 WebConfig 配置: 1.先添加connectionstrings,providerName 换成 mysql的 <connectionStrings> ...

  5. supervisor process management

    supervisor是unix like系统的进程管理工具 安装: pip install supervisor 配置文件: echo_supervisord_conf # 打印一个配置文件样例 ec ...

  6. 注解(Annotation)是什么?

  7. Delphi Class of 类引用

    Delphi Class of 类引用也就是类的类型,也可说是指向类的指针 Type TControlCls = Class of TControl;function CreateComponent( ...

  8. week05 06绑定滚动条 去抖动

    像这种小代码 为了满足某种需求 可以直接上网搜 这些都是JS代码和react无关 我们下拉 就会触发事件从而调用loading more news 那个函数 react要求我们加个key key就是唯 ...

  9. win10 搭建react-native开发环境

    本文地址:http://www.cnblogs.com/jying/p/7992130.html 系统:win10 系统内存:8G java-jdk:1.8.144 开发工具:vs code 首先是网 ...

  10. 面试官提出的问题应该怎么答?(如开发中使用过EasyUI吗?)

    Jquery EasyUI是第三方基于Jquery框架开发的一款轻量级的,侧重于页面显示部分的框架,也可以称为插件. Jquery EasyUI使用比较简单,也有比较全的文档可供参考. 常用的组件就是 ...