总是听人说手写栈或者手写队列比stl快
但是又有很多大佬说stl并不慢
我觉得也不应该慢很多要不发明stl干什么的
不过如果算法写得很烂或者卡常数的时候
还是用一波手写的垂死挣扎一下吧
这里搞一个基本上跟stl用法完全一样的手写栈
STRUCT!
手写准备
struct stack{
int sta[MAXN] , topp;
stack(){ topp=0; }//结构体内的初始化
void push(int x){ sta[++topp] = x;}
void pop(){ topp--;}
int top(){ return sta[topp];}
int size(){ return topp;}
bool empty(){ return topp==0 ? 1 : 0;}
};
声明一个栈
struct stack s;
调用函数
s.push();
s.pop();
s.top();
s.size();
s.empty();
//你看,不是不跟stl的使用方法完全一样
更进一步
stl里我们调用栈的时候
stack<int> s;
可以更改<>中的数据类型以达到我们想要的目的
这个手写的也可以
只需要在声明结构体成员的时候把sta[]声明成你想要的类型即可
小tip:
这样记得不要声明stack那个库
也不要开bits/stdc++.h
不然
[Error] reference to ‘stack’ is ambiguous
完整CODE
#include<iostream>
#define R register int
using namespace std;
const int N = 1e5+5;
int x,m;
string str;
struct stack{
int sta[N] , topp;
stack(){ topp=0; }//结构体内的初始化
void push(int x){ sta[++topp] = x;}
void pop(){ topp--;}
int top(){ return sta[topp];}
int size(){ return topp;}
bool empty(){ return topp==0 ? 1 : 0;}
};
struct stack s;
int main(){
scanf("%d",&m);
while(m--) {
cin>>str;
if(str=="push") { cin>>x; s.push(x);}
else if(str=="pop") s.pop();
else if(str=="empty") s.empty() ? cout<<"YES\n" : cout<<"NO\n";
else cout<<s.top()<<endl;
}
return 0;
}
手打才是真香!