栈的概念以及栈的实现
栈是一种只允许在一端进行插入和删除的线性表
空栈:没有任何元素
入栈:插入元素
出栈:删除元素
栈本身就是一个线性表,我们可以写一个足够大的数组来实现栈
除此之外,我们还需要变量n来记录栈顶元素和栈的元素个数
我们来实现一下栈
cpp
#include <iostream>
using namespace std;
const int N = 1e6;
int st[N];
int n = 0;
void push(int x)
{
st[++n] = x;
}
void pop()
{
--n;
}
int top()
{
return st[n];
}
int size()
{
return n;
}
bool empty()
{
return n == 0;
}
int main()
{
for (int i = 0; i < 10; i++)
{
push(i);
}
while (size())
{
cout << top() << " ";
pop();
}
}
上述代码就是我们栈的实现,我们栈的元素是从数组下标为1开始的,如果栈顶下标是0的话就是空栈
我们入栈是0,1,2,3,4,5,6,7,8,9
出栈的时候就是从9开始弹出
STL 的stack
除了我们的静态的栈,我们stl库里面还有一个现成的栈,叫stack,它的创建和vector实际上是差不多的
我们来测试一下stack
cpp
#include <iostream>
#include <stack>
using namespace std;
const int N = 1e6;
stack <int> st;
int main()
{
for(int i =0 ;i<10;i++)
{
st.push(i);
}
while(!st.empty())
{
cout << st.top() << " ";
st.pop();
}
}
栈和stack的算法题
栈的模板题
这道题我们有两个需要注意的点,第一个数据范围
int的数据范围是-2的31次方到2的31次方-1
unsigned int是0到 2的32次方-1
long long的范围是2的63次方-1
unsigned long long的范围是2的64次方减1
所以我们栈的数据类型应该是unsigned longlong
第二点就是,我们每组数据是隔离的,互不影响的,所以我们要处理脏数据,再每次处理完一组数据之后,要清空我们的栈
这是我们ac的代码
cpp
#include <iostream>
using namespace std;
const int N = 1e6+10;
typedef unsigned long long LL;
LL st[N];
int top;
int main()
{
int t;
int n;
cin >> t;
while(t--)
{
top = 0;
int n;
cin >> n;
while(n--)
{
string op;
cin >> op;
if(op == "push")
{
LL x;
cin >> x;
st[++top] =x;
}
else if(op == "pop")
{
if(top == 0)
cout << "Empty" << endl;
else
top--;
}
else if(op == "query")
{
if(top == 0)
{
cout <<"Anguei!" << endl;
}
else
cout << st[top] << endl;
}
else
{
cout << top << endl;
}
}
}
return 0;
}
栈的算法题之有效的括号
这道题我们用stack来解决一下
如果是左括号,我们入栈,如果是右括号,我们进行匹配,匹配成功出栈,匹配如果不成功那我们就返回false,最后我们还要查看一下栈是不是空,如果不是空,还是false
cpp
class Solution {
public:
bool isValid(string s) {
stack <char> a;
for(auto e:s)
{
if (e == '(' or e == '[' or e=='{')
{
a.push(e);
}
if(e == ')' or e == ']' or e== '}')
{
if(empty(a))
return false;
if((e == ')' && a.top() != '(') or (e == '}' && a.top() != '{') or(e == ']' && a.top() != '[')) return false;
a.pop();
}
}
return empty(a);
}
};
小tips :我们要注意,右括号匹配的时候,如果栈空了,也是要返回false的,如果没有判空这一个条件,我们取top就会越界。