笔者在做下面这道题的时候想到用栈,但写的很麻烦
代码:
#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不提供遍历功能,也不提供迭代器。