IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构——栈(概念讲解、代码实现及应用) -> 正文阅读

[数据结构与算法]数据结构——栈(概念讲解、代码实现及应用)

? 一、栈的定义和特征

? ? ? ? 栈是n个元素的有限序列,且只能在一端插入和删除的线性表,当n为0时,栈为空栈

? ? ? ? 下面我们来简单的分析一下栈的特征:假设我们向空栈中依次插入元素a1到an,那么由定义可知,删除这些元素的顺序只能是从an到a1,这说明栈具有后进先出(先进后出)的特征,也可以称为“first in last out”。

二、栈的某些术语和常用运算函数

????????栈顶:指的是插入和删除元素的一侧,也称为top。

? ? ? ? 栈底:栈的另一端,也叫bottom

? ? ? ? 入栈:也叫压栈,指的是向栈中插入元素

? ? ? ? 出栈:也叫弹栈,指的是从栈顶删除元素

????????

????????以上仅仅是对于栈的抽象描述,但在实际解决问题中,我们需要通过实现栈来完成一些需要用到的运算,则需要定义好有关栈的函数。在实际编写中,我们需要写一个C++的类来抽象出栈,即class stack,在stack内部进行基本运算,也就是内部成员函数的编写。对于栈的实现,有链式储存和顺序储存两种方式。在此讨论顺序储存。那么大家知道,顺序存储的本质其实就是通过数组开辟连续的一串储存空间,因此需要在stack的私有成员中定义cnt作为计量当前栈中元素个数的变量,定义数组data[maxlen]储存栈中元素。其基本运算如下:

? ? ? ? 初始化:即所谓的构造函数,需要将栈设置为空,也就是cnt为0

? ? ? ?判断栈空和满:作为bool型函数,判空则仅需判断cnt是否为0,判满仅需判断cnt是否等于manlen-1

? ? ? ?取栈顶: 在取栈顶元素时,首先应该判断栈是否为空,不为空才能取,否则应给出相应标识

? ? ? ?入栈:将元素放入栈中的前提是栈不满,因此需先进行判断

? ? ? ?出栈:将栈顶删除的前提是栈不为空,因此也需先进行判断

#pragma once
#include<iostream>
enum Error_code{underflow,overflow,success};//对一些情况进行判断
#define maxlen 100//定义栈最大容量
class stack
{
public:
	stack();
	~stack();
	bool empty();
	bool full();
	Error_code top(int& x);
	Error_code push(int x);
	Error_code pop();
private:
	int cnt;
	int data[maxlen];
};
#include"stack.h"
stack::stack()
{
	cnt = 0;
	for (int i = 0; i < maxlen; i++)
		data[i] = 0;
}
stack::~stack()
{
	while (!empty())
		pop();
}
bool stack::empty()
{
	return cnt == 0;
}
bool stack::full()
{
	return cnt == maxlen - 1;
}
Error_code stack::top(int& x)
{
	if (empty())
		return underflow;
	else
	{
		x = data[cnt - 1];
		return success;
	}
}
Error_code stack::pop()
{
	if (empty())
		return underflow;
	else
	{
		cnt--;
		return success;
	}
}
Error_code stack::push(int x)
{
	if (full())
		return overflow;
	else
	{
		data[cnt] = x;
		cnt++;
		return success;
	}
}

? 三、栈的常见应用

? ? ? ? 例1:算法完成将十进制转换为八进制

? ? ? ? 解:首先我们需要了解的知识是,将十进制转化为八进制所采用的的方法是“除取余数法”,即每次用8除以十进制数N所得的余数作为八进制数的各位,将相除所得的商的整数部分作为新的N重复计算直到N为0.

?

?于是根据栈后入先出的特征,可得如下代码:

void turn(int n)//输入十进制数n
{
	stack s;//定义一个空栈
	int mod, x;
	while (n != 0)
	{
		mod = n % 8;//n对8取余数后入栈
		s.push(mod);
		n = n / 8;//n除等于8,继续循环
	}
	while (!s.empty())
	{
		s.top(x);//逆向输出
		cout << x;
		s.pop();
	}
}

栈在表达式计算中的应用

????????其基本思想如下:

? ? ? ? 1、用两个栈分别保存操作数和运算符,不妨称之为操作数栈和运算符栈

? ? ? ? 2、依次扫描表达式中的各基本符号(每个操作数和运算符均看做一个基本符号),并对扫描结果进行处理

? ? ? ? (1)如果扫描的基本符号是操作数,则将此操作数直接放入到操作数栈中,然后继续扫描其后续符号

? ? ? ? (2)如果扫描的基本符号是运算符,如果栈顶运算符的优先级低于当前所扫描的运算符的优先级,则栈顶运算符不能进行运算,将当前扫描的运算符入栈,然后继续扫描后续符号。如果栈顶运算符的优先级高于当前所扫描的运算符的优先级,此时取出操作数栈顶的两个元素进行局部运算,之后将结果再进入到此栈中。

? ? ? ? 3.如果此时运算符栈不空,需要继续以栈顶运算符对当前运算符重复上述操作。

基本思路图解如下:

?

?

?????????这样就可以通过栈来实现计算器的基本功能,如果你还想要一个漂亮的可视化界面,则还需要用到Qt等相关知识,相关博客链接:https://blog.csdn.net/sjl20021006/article/details/117400261?spm=1001.2014.3001.5502

?

? ? ? ? 以上就是我对栈的基本理解和一些解释啦,希望对读者能有帮助。

? ? ? ? 希望大家点个赞,你们的赞是我创作的动力!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 16:29:50  更:2021-07-27 16:32:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 17:34:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码