蓝桥杯备考:数据结构之栈 和 stack

栈的概念以及栈的实现

栈是一种只允许在一端进行插入和删除的线性表

空栈:没有任何元素

入栈:插入元素

出栈:删除元素

栈本身就是一个线性表,我们可以写一个足够大的数组来实现栈

除此之外,我们还需要变量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就会越界。

相关推荐
范纹杉想快点毕业4 小时前
XML通过HTTP POST 请求发送到指定的 API 地址,进行数据回传
xml·c语言·开发语言·数据结构·c++·python·c#
星迹日5 小时前
数据结构:LinkedList与链表—无头单向链表(一)
java·数据结构·经验分享·笔记·链表·单向链表
OTWOL5 小时前
栈与队列OJ题精选,数据结构的实践应用
数据结构
bachelores5 小时前
数据结构-排序
数据结构·算法·排序算法
tan180°5 小时前
Cpp::C++11右值引用与移动构造(30)
开发语言·数据结构·c++·后端·算法
2401_858286116 小时前
123.【C语言】数据结构之快速排序挖坑法和前后指针法
c语言·开发语言·数据结构·算法·排序算法
羊小猪~~7 小时前
C/C++语言基础--C++STL库算法记录(质变算法、非质变算法、查找、排序、排列组合、关系算法、集合算法、堆算法等)
c语言·开发语言·数据结构·c++·算法·stl
bachelores9 小时前
数据结构-栈、队列和数组
数据结构·算法
好记性+烂笔头9 小时前
hot100_73. 矩阵置零
数据结构·算法·矩阵