首页 > 其他分享 >栈 Stack

栈 Stack

时间:2024-03-21 17:46:00浏览次数:20  
标签:tmp return top template NULL Stack

2024.3.18
芝士wa
参考视频:bilibli-数据结构-栈


栈 Stack

定义

栈是一个列表或集合,它的插入和删除只能在一端进行,称之为栈顶。栈是一种LIFO(Last in first out)型ADT。

汉诺塔


栈的基本操作:

  • 入栈
  • 出栈
  • 返回栈顶元素
  • 判断是否为空
    以上操作的时间复杂度均为O(1)。

应用

  • 递归
  • 实现撤回操作
  • 编译器语法检查,括号配对
  • 前缀和后缀的计算,与中缀的转换

用数组实现栈很简单,在此不做赘述,下面介绍如何用链表实现一个栈

#pragma once
#include <iostream>
using namespace std;


class EmptyStackException : public std::exception {
public:
	const char* what() const noexcept override {
		return "Stack is empty.";
	}
};

template<class T>
class Node
{
public:
	T data;
	Node* next;
};

template<class T>
class Stack
{
public:
	Node<T>* top;

	Stack();
	~Stack();

	void push(T x);

	void pop();

	void print();

	T gettop();

	bool isEmpty();
};

template<class T>
Stack<T>::Stack()
{
	top = NULL;
}

template<class T>
Stack<T>::~Stack()
{

}

template<class T>
void Stack<T>::push(T x)
{
	Node<T>* tmp = new Node<T>;
	tmp->data = x;
	tmp->next = top;
	top = tmp;
}

template<class T>
void Stack<T>::pop()
{
	Node<T>* tmp = new Node<T>;
	if (top == NULL) {
		return;
	}
	tmp = top;
	top = top->next;
	delete(tmp);
}

template<class T>
T Stack<T>::gettop()
{
	if (top == NULL) {
		throw EmptyStackException();
	}
	return top->data;
}


template<class T>
bool Stack<T>::isEmpty()
{
	if (top == NULL) {
		return true;
	}
	return false;
}

template<class T>
void Stack<T>::print()
{
	if (top == NULL) {
		cout << "null,nothing to print" << endl;
		return;
	}
	Node<T>* tmp = top;
	while (tmp != NULL)
	{
		cout << tmp->data << endl;
		tmp = tmp->next;
	}
	return;
}
上述代码使用链表结构实现了一个基本的栈。

注意:当top为NULL时,由于T是泛型类型,没有一个默认值,因此无法直接返回一个默认值。一种常见的做法是抛出一个异常,表示栈为空。


leetcode-206反转链表

题目链接
有三种解题方法,分别是双指针法,递归法,栈。
由于栈具有先入后出的特性,因此可以解决反转问题。
栈方法的代码如下:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (head == NULL) {
            return NULL;
        }
        stack<struct ListNode*> s;
        ListNode* tmp = head;
        while (tmp != NULL) {
            s.push(tmp);
            tmp = tmp->next;
        }
        tmp = s.top();
        head = tmp;
        s.pop();
        while (!s.empty()) {
            tmp->next = s.top();
            s.pop();
            tmp = tmp->next;
        }
        tmp->next = NULL;
        return head;
    }
};

总结

介绍了栈的基本特性,用链表的方式实现了栈,针对栈的应用,给出了leetcode-206题的解法。

标签:tmp,return,top,template,NULL,Stack
From: https://www.cnblogs.com/cheese-wa/p/18080903

相关文章

  • 云效 AppStack + 阿里云 MSE 实现应用服务全链路灰度
    作者:周静、吴宇奇、泮圣伟在应用开发测试验证通过后、进行生产发布前,为了降低新版本发布带来的风险,期望能够先部署到灰度环境,用小部分业务流量进行全链路灰度验证,验证通过后再全量发布生产。本文主要介绍如何通过阿里云MSE微服务引擎和云效应用交付平台AppStack实现灰度发布。......
  • 云效 AppStack + 阿里云 MSE 实现应用服务全链路灰度
    作者:周静、吴宇奇、泮圣伟在应用开发测试验证通过后、进行生产发布前,为了降低新版本发布带来的风险,期望能够先部署到灰度环境,用小部分业务流量进行全链路灰度验证,验证通过后再全量发布生产。本文主要介绍如何通过阿里云MSE微服务引擎和云效应用交付平台AppStack实现灰度发布。......
  • ES9200端口漏洞添加授权:es集群添加用户安全认证功能(Set up basic security for the E
    hR0wZPaaSHmi-slI0GAVMw文章目录引言I设置访问密码1.1每个集群节点都需要编辑elasticsearch.yml文件1.2生成elastic-certificates.p121.3重启ES集群1.4创建Elasticsearch集群密码1.5访问验证1.6kibana设置elasticsearch帐号密码1.7logstash......
  • saltstack的二次开发
    1.Grains的二次开发在master上添加Grains,且同步给minion。注意:只能从master同步给minion,而不能从master通过syndic同步给minion。在master的file_roots目录下建_grains,在_grains目录下写grains的py文件,用return返回就可以拉vimmy_grains.pydefmy_grains():'''My......
  • 【算法训练营】STL算法 Stack 栈的压入、弹出序列+最小栈
    Stack刷题1.最小栈2.栈的压入、弹出序列1.最小栈题目链接:最小栈题目描述解决思路创建一个辅助栈只保存最小的元素代码classMinStack{public:MinStack(){}voidpush(intval){//只要是压栈,先将元素保存到_elem中......
  • stack和queue
    stack的介绍1.stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2.stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,......
  • 【App Service】在Azure App Service中分析.NET应用程序的性能的好帮手(Review Stack
    AzureAppService.NETProfiler在AppService服务中,如果部署了.NET应用,平台有一个非常好的工具可以查看请求的性能分布及异常时的StackTraces。进入路径:AppServiceAzureOverview-->  Networking(网络)-->Troubleshoot(排除故障)--> Collect.NETProfilerTrace......
  • WPF —— TabControl、StackPanel 控件详解
    1TabControl简介表示包含多个项的控件,这些项共享屏幕上的同一空间。TabControl有助于最大程度地减少屏幕空间使用量,同时允许应用程序公开大量数据。 TabControl包含共享同一屏幕空间的多个TabItem对象。一次只能看到TabControl中的一个 TabItem。当用户选择的Tab......
  • 【STL】 C++常用容器介绍系列(一)----(map、set、stack)
    目录一、map系列1、map介绍2、unordered_map介绍3、map和unordered_map的选择二、set系列1、set介绍2、unordered_set介绍3、set和unordered_set的选择三、如何遍历和查询map和set1、map的遍历2、map的查询3、set的遍历4、set的查询四、stack介绍和操作stack的方......
  • jstack命令详解及常用命令
    六种Java线程状态新建状态(New):当创建一个Thread实例后,线程就处于新建状态。此时线程对象已经被分配了内存,并初始化了其成员变量的值。就绪状态(Runnable):也被称为“可执行状态”。当调用了线程的start()方法后,线程就进入了就绪状态。此时线程已经具备了执行的条件,等待CPU调度执行......