【STL】栈(stack)

本文介绍了如何在C++中使用STL库中的stack容器来实现栈的操作,包括基本的push、pop、getTop以及更高级的emplace,同时对比了自定义栈的实现方法,并提到了STL头文件的优点和缺点,以及stack不支持迭代器的特点。
摘要由CSDN通过智能技术生成

笔者在做下面这道题的时候想到用栈,但写的很麻烦

括弧匹配检验

代码:

#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不提供遍历功能,也不提供迭代器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值