笔者在做下面这道题的时候想到用栈,但写的很麻烦
代码:
#include<bits/stdc++.h>
using namespace std;
#define MAXC 255
typedef int SElemType;
typedef struct StackNode
{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStack;
bool Push(LinkStack &S,SElemType e)
{
StackNode *p;
p=new StackNode;
p->data=e;
p->next=S;
S=p;
return 1;
}
bool Pop(LinkStack &S,SElemType &e)
{
LinkStack p;
if(S==NULL)return false;
e=S->data;
p=S;
S=S->next;
free(p);
return true;
}
bool GetTop(LinkStack &S,SElemType &e)
{
if(S==NULL) return false;
e=S->data;
return true;
}
bool isMatch(char ch[],LinkStack &S){
SElemType e;
for(int i=0;i<strlen(ch);i++){
if(ch[i]=='['){
Push(S,1);
}
else if(ch[i]=='('){
Push(S,0);
}
else if(ch[i]==']'){
if(GetTop(S,e)&&e==1) Pop(S,e);
else return 0;
}
else if(ch[i]==')'){
if(GetTop(S,e)&&e==0) Pop(S,e);
else return 0;
}
}
if(S!=NULL) return 0;
return 1;
}
int main(){
LinkStack S;
S = NULL;
char ch[MAXC];
cin>>ch;
if(isMatch(ch,S)) cout<<"OK";
else cout<<"Wrong";
return 0;
}
需要自己定义栈,定义入栈、出栈、取栈顶函数。
笔者是个嫌麻烦的人(绝对不是懒),找到了STL这个法宝!
STL的组件之一是容器,容器里面就有我们的栈,“bangbangbangbang”
STL是个宝,头文件可不能少:
#include<stack>//这是栈的
当然,笔者是个懒蛋,有请万能头文件:
#include<bits/stdc++.h>
它是一个包含了每一个标准库的头文件。
优点:
- 在算法竞赛中节约时间;
- 减少了编写所有必要头文件的工作量。
缺点:
- 不是GNU C++库的标准头文件,在部分情况下会编译失败;
- 包含了很多不必要的东西,会大大增加编译时间。
栈的定义
stack<typename> stackname;
//typename为类型名,stackname为栈的命名,类型名可以不写
stack stackname;
//stack对象的拷贝构造与赋值
stack(const stack &stk); //拷贝构造函数
stack& operator=(const stack &stk); //重载等号操作符
栈的成员函数
函数名 | 功能 |
---|---|
.empty() | 判断栈是否为空,空则返回true |
.pop() | 出栈 |
.push() | 压栈 |
.size() | 返回栈中元素数目 |
.top() | 返回栈顶元素 |
s.swap(s2) | 交换s和s2里面的值(s2需要和s是一个类型) |
实例:
stack<int>sta;
sta.push(9);
stack<int> sta1(sta); //调用拷贝构造函数
stack<int> sta2;
sta2=sta; //等号重载赋值
stack<int> sta3=sta; //调用拷贝构造函数,只有这条语句执行会调用构造函数,此处为调用拷贝构造函数而不是用等号重载赋值
stack<int> sta;
sta.push(1);
sta.push(2);
sta.push(3);
sta.emplace(4);
stack<int> sta1;
sta1.push(5);
sta1.push(6);
sta.swap(sta1);
cout <<"sta.size() is " << sta.size() << endl;
cout << "sta1.size() is " << sta1.size() << endl;
while (!sta1.empty())
{
cout << sta1.top() << endl;
sta1.pop();
}
emplace:C++11新特性emplace操作
这样一开始的代码就可以改写的简单了,这里还有一种解法:
#include<iostream>
#include<cstring>
using namespace std;
char a[255]={0};
int main(){
int i,n,t,j,k;
string s;
bool f;
cin>>s;t=0;
for(j=0;j<=s.size()-1;j++){
if(s[j]=='('||s[j]=='[') a[++t]=s[j];
//如果是左括号就进栈
if(s[j]==')') if(a[t]=='(') t--;else t++;
if(s[j]==']') if(a[t]=='[') t--;else t++;
//不匹配就出栈
}
if(t==0) cout<<"OK"<<endl;
else cout<<"Wrong"<<endl;
return 0;
}
stack没有迭代器
Stack所有元素的进出都必须符合”先进后出”的条件,只有stack顶端的元素,才有机会被外界取用。Stack不提供遍历功能,也不提供迭代器。