顺序栈的c++实现及利用其实现括号的匹配
#include<iostream>
#include<cassert>
#include<cstring>
#include<string>
using namespace std;
int maxLength=100;
const int stackIncreament = 20;
template<class T>
class Stack{
public:
Stack(){}
virtual void Push(const T& x)=0;
virtual bool Pop(T& x)=0;
virtual bool getPop(T& x)=0;
virtual bool IsEmpty()=0;
virtual bool IsFull()=0;
virtual int getSize()=0;
};
template<class T>
class SeqStack:public Stack<T>{
public:
SeqStack(int sz=50);
~SeqStack(){delete []elements;}
void Push(const T& x);
bool Pop(T& x);
bool getPop(T& x);
bool IsEmpty(){return (top==-1)? true:false;}
bool IsFull() {return (top==maxSize-1)?true:false;}
int getSize(){return top+1;}
void MakeEmpty(){top=-1;}
private:
T *elements;
int top;
int maxSize;
void overflowProcess();
};
template<class T>
SeqStack<T>::SeqStack(int sz){
top=-1;
maxSize=sz;
elements = new T[maxSize];
assert(elements!=NULL);
}
template<class T>
void SeqStack<T>::Push(const T& x)
{
if(IsFull()==true)
overflowProcess();
elements[++top]=x;
}
template<class T>
bool SeqStack<T>::Pop(T& x)
{
if(IsEmpty()==true)
return false;// cout<<top<<endl;
x=elements[top--];
return true;
}
template<class T>
bool SeqStack<T>::getPop(T& x)
{
if(IsEmpty()==true)
return false;
x=elements[top];
return true;
}
template<class T>
void SeqStack<T>::overflowProcess(){
T *newArray = new T[maxSize+stackIncreament];
if(newArray==NULL)
{
cout<<"内存分配失败"<<endl;
return ;
}
for(int i=0;i<=top;i++)
{
newArray[i]=elements[i];
}
maxSize=maxSize+stackIncreament;
delete []elements;
elements =newArray;
}
void printMatchedPairs(string expression)
{
SeqStack<int> s(maxLength);
SeqStack<int> a(maxLength);
SeqStack<int> b(maxLength);
int j,c,d,r,t=0,length=expression.length();
int e=0,m=0;
for(int i=1;i<=length+1;i++)
{
if(expression[i-1]=='(')
s.Push(i);
else if(expression[i-1]==')')
{
for(int r=1;r<=i;r++)
if(expression[r-1]==']'||expression[r-1]=='}')
t++;
if(t!=0)
{
cout<<"failure";
m++;
break;
}
s.Pop(j);
}
else if(expression[i-1]=='[')
a.Push(i);
else if(expression[i-1]==']')
{
for(int r=1;r<=i;r++)
if(expression[r-1]=='}')
e++;
if(e!=0)
{
cout<<"failure";
m++;
break;
}
a.Pop(j);
}
else if(expression[i-1]=='{')
b.Push(i);
else if(expression[i-1]=='}')
b.Pop(d);
}
if(m==0)
{
if(s.IsEmpty()==true&&a.IsEmpty()==true&&b.IsEmpty()==true)
{
cout<<"success";
}
else
cout<<"failure";
}
}
int main()
{
string expression;
cin>>expression;
printMatchedPairs(expression);
return 0;
}
顺序栈的c++实现及利用其实现括号的匹配的更多相关文章
- 【js数据结构】栈解决括号不匹配问题
栈可以用来判断一个算术表达式中的括号是否匹配. 思路:读取算术表达式,遇到左括号'{'.'['.'('压入栈,栈的特点是后入先出,所以当遇到右括号'}'.']'.')'的时候,取出栈顶元素,是否满足读 ...
- 利用顺序栈解决括号匹配问题(c++)-- 数据结构
题目: 7-1 括号匹配 (30 分) 给定一串字符,不超过100个字符,可能包括括号.数字.字母.标点符号.空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入格式: 输入在一行 ...
- 数据结构:C_顺序栈的实现
数据结构顺序栈的实现(C语言版) 1.写在前面 栈是一种遵循元素先进(Push)后出(Pop)规则的线性表,它的实现可以用数组或者链表. ..... 2.代码分解 2.1对栈的结构定义: typede ...
- 数据结构——Java实现顺序栈
一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 顺序栈是指利用顺序存储结构实现 ...
- C++栈学习——顺序栈和链栈的差别
C++中栈有顺序栈和链栈之分.在顺序栈中,定义了栈的栈底指针(存储空间首地址base).栈顶指针top以及顺序存储空间的大小stacksize(个人感觉这个数据成员是能够不用定义的) //顺序栈数据结 ...
- Java的顺序栈和链式栈
栈的定义 栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入.删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈. 通常删除(又称"退栈")叫做弹出p ...
- Java栈之顺序栈存储结构实现
一.栈的基本定义 栈是一种数据结构,它代表一种特殊的线性表,这种线性表只能在固定一端(通常认为是线性表的尾端)进行插入.删除操作的特殊线性表,通常就是在线性表的尾端进行插入.删除操作. 二.顺序栈的实 ...
- 数据结构实验3:C++实现顺序栈类与链栈类
实验3 3.1 实验目的 熟练掌握栈的顺序存储结构和链式存储结构. 熟练掌握栈的有关算法设计,并在顺序栈和链栈上实现. 根据具体给定的需求,合理设计并实现相关结构和算法.3.2实验要求3.2.1 ...
- 数据结构 - 顺序栈的实行(C语言)
数据结构-顺序栈的实现 1 顺序栈的定义 既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们简称为顺序栈.线性表是用数组来实现的,对于栈这种只能一头插入删除的线性表来说,用数组哪 ...
随机推荐
- spark操作elasticsearch数据的限制
对于复杂的数据类型,比如IP和GeoPoint,只是在elasticsearch中有效,用spark读取时会转换成常用的String类型. Geo types. It is worth mention ...
- 最好的vim教程莫过于vimtutor
最好的vim教程莫过于vimtutor 直接运行vimtutor即可
- Linux学习笔记<三>
<1>查看本机的IP地址 命令:ifconfig -a 机器的ip地址是:(inet 地址:172.16.163.57 ) <2>单独查看内存使用情况的命令:free -m 查 ...
- yum安装指定(特定)版本(旧版本)软件包的方法
在命令行里输入: yum list SDL 注意这里类库的名字是区别大小写的. 参考 http://www.dabu.info/yum-install-specific-version-old-pac ...
- 2014-10-2 bug更新5 ecshop和ectouch解决动态ip登录超时和购物车清空问题
有客户说登陆网站后台操作的时候,会时不时的掉一下,要重新登陆才能继续操作,自动登出的频率快和时间短,针对这个问题是因为: 购物车问题原因的产生是因为动态IP的SESSEION机制导致很多在公司或者其他 ...
- setObject()用法
setObject()用法 setObject(i+1,arg[i])用法与setInt(i+1,arg[i]),setString(i+1,arg[i])用法类似, 但不需指定参数类型,可以通用: ...
- Python socket编程
一.什么是socket: socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求 ...
- ServletContext
1.为什么需要servletContext 需求1 需求2 --------------->解决之道servletContext servletContext 1.ServletC ...
- 跨区域的application共享问题。
@1 new Thread(){ @Override public void run() { getConnect(); } }.start(); 如果我们的一个的应用程序有俩个入口.那么如果我们在这 ...
- linux安装-版本选择-终极决定
选用64位或32位的版本,注意看硬件: 内存大于4G的用64位, 小于4G的用32位 同时, 64位的版本在软件源, 软件的兼容性等问题. ----------------------------- ...