C++知识点总结(24):数据结构与栈

数据结构与栈

  • 一、概念
    • [1. 数据](#1. 数据)
    • [2. 数据结构](#2. 数据结构)
    • [3. 数据结构分类](#3. 数据结构分类)
  • 二、栈
    • [1. 栈](#1. 栈)
    • [2. 相关概念](#2. 相关概念)
      • [2.1 入栈](#2.1 入栈)
      • [2.2 出栈](#2.2 出栈)
      • [2.3 栈的特点](#2.3 栈的特点)
      • [2.4 栈顶](#2.4 栈顶)
      • [2.5 栈底](#2.5 栈底)
      • [2.6 栈顶元素](#2.6 栈顶元素)
      • [2.7 栈底元素](#2.7 栈底元素)
  • 三、数组模拟栈
    • [1. 初始化空栈](#1. 初始化空栈)
    • [2. 入栈](#2. 入栈)
    • [3. 出栈](#3. 出栈)
    • [4. 获取栈顶元素](#4. 获取栈顶元素)
    • [5. 判断栈是否为空](#5. 判断栈是否为空)
    • [6. 获取栈内元素个数](#6. 获取栈内元素个数)
  • 四、栈的运用
    • [1. 括号的匹配](#1. 括号的匹配)
      • [1.1 审题](#1.1 审题)
      • [1.2 参考答案](#1.2 参考答案)
    • [2. 括号的匹配 2.0](#2. 括号的匹配 2.0)
      • [2.1 审题](#2.1 审题)
      • [2.2 参考答案](#2.2 参考答案)
    • [3. 括号的匹配 3.0](#3. 括号的匹配 3.0)
      • [3.1 审题](#3.1 审题)
      • [3.2 参考答案](#3.2 参考答案)

一、概念

1. 数据

数据就是电脑可以存储的东西,例如一段文字、图片、视频、音频等等。

计算机系统中,各种字母、数字符号的组合、语音、图形、图像等,统称为数据。

计算机科学中,数据是指所有能输入到计算机并被计算机程序处理的符号总称。

2. 数据结构

数据结构是计算机存储、组织数据的一个方式,是指相互之间存在一种,或多种特定关系的数据元素的集合。

3. 数据结构分类

数据结构 逻辑结构 非线性结构 集合结构 同属一个集合别无其他关系 树状结构 一对多 图状结构 多对多 线性结构 一对一 物理结构 顺序结构 链式结构 单链表 双链表 循环链表 索引结构 不涉及 散列结构

二、栈

1. 栈

栈是只能在某一端插入和删除的特殊线性表,进行删除和插入的一端称作栈顶,另一端称作栈底。

2. 相关概念

2.1 入栈

又叫压入,把数据装入栈

2.2 出栈

又叫弹出、弹栈,把数据从栈取出

2.3 栈的特点

先进后出,后进先出

2.4 栈顶

允许进出的一端

2.5 栈底

不允许进出的一端

2.6 栈顶元素

最上方的元素,最后入栈的元素

2.7 栈底元素

最下方的元素,最先入栈的元素

三、数组模拟栈

1. 初始化空栈

一个栈可以用定义长度为 n + 1 n+1 n+1 的数组 s s\[\] s\[\] 来表示,该栈存储 n n n 个元素,然后设置指针指向栈顶元素。

cpp 复制代码
const int n = 100;
数据类型 s[n+1];
int top = 0;

2. 入栈

cpp 复制代码
void push(数据类型 x)
{
    if (top < n) // 如果栈未满
    {
        s[++top] = x;
    }
    // 上溢处理...
}

3. 出栈

cpp 复制代码
void pop()
{
    if (top > 0) // 如果不是空栈
    {
        top--;
    }
    // 下溢处理...
}

4. 获取栈顶元素

cpp 复制代码
数据类型 getTop()
{
    return s[top];
}

5. 判断栈是否为空

cpp 复制代码
bool isEmpty()
{
    return (top == 0); // top = 0 时是空栈
}

6. 获取栈内元素个数

cpp 复制代码
int sizeStack()
{
    return top;
}

四、栈的运用

1. 括号的匹配

1.1 审题

题目描述

假设一个表达式有英文字母(小写)、运算符( + + +, − - −, × \times ×, ÷ \div ÷)和左右小(圆)括号构成,以" @ @ @"作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回"YES";否则返回"NO"。假设表达式长度小于 255 255 255,左圆括号少于 100 100 100 个。

输入描述

包括一行数据,即表达式

输入文件为 bracket.in

输出描述

包括一行,即"YES"或"NO"

输出文件为 bracket.out

样例1

输入

复制代码
2*(x+y)/((1-x)*2)@

输出

复制代码
YES

1.2 参考答案

cpp 复制代码
#include <iostream>
#include <cstdio>
using namespace std;

char s[105];
char c;
int top;

int main() 
{
    freopen("bracket.in", "r", stdin);
    freopen("bracket.out", "w", stdout);
    
	while (cin >> c)
	{
	    if (c == '@')
	    {
	        break;
	    }
	    
	    if (c != '(' && c != ')')
	    {
	        continue;
	    }
	    
	    if (c == '(')
	    {
	        s[++top] = c;
	    }
	    else
	    {
	        if (top == 0)
	        {
	            cout << "NO" << endl;
	            return 0;
	        }
	        top--;
	    }
	}
	
	if (top == 0)
	{
	    cout << "YES";
	}
	else
	{
	    cout << "NO";
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}

2. 括号的匹配 2.0

2.1 审题

题目描述

假设一个表达式有英文字母(小写)、运算符( + + +, − - −, × \times ×, ÷ \div ÷)和左右小、中(圆)括号构成,以" @ @ @"作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回"YES";否则返回"NO"。如果中括号在小括号内,是不合法的。假设表达式长度小于 255 255 255,左圆括号少于 100 100 100 个。

输入描述

包括一行数据,即表达式

输入文件为 bracket.in

输出描述

包括一行,即"YES"或"NO"

输出文件为 bracket.out

样例1

输入

复制代码
2*(x+y)/([1-x])*2)@

输出

复制代码
NO

2.2 参考答案

cpp 复制代码
#include <iostream>
#include <cstdio>
using namespace std;

char s[105];
char c;
int top;

int main() 
{
    freopen("bracket.in", "r", stdin);
    freopen("bracket.out", "w", stdout);
    
	while (cin >> c)
	{
	    if (c == '@')
	    {
	        break;
	    }
	    
	    if (c == '(')
	    {
	        s[++top] = c;
	    }
	    else if (c == '[')
	    {
	        if (s[top] == '(')
	        {
	            cout << "NO";
	            return 0;
	        }
	        else
	        {
	            s[++top] = c;
	        }
	    }
	    else if (c == ')')
	    {
	        if (s[top] == '(')
	        {
	            top--;
	        }
	        else
	        {
	            cout << "NO";
	            return 0;
	        }
	    }
	    else if (c == ']')
	    {
	        if (s[top] == '[')
	        {
	            top--;
	        }
	        else
	        {
	            cout << "NO";
	            return 0;
	        }
	    }
	}
	
	if (top == 0)
	{
	    cout << "YES";
	}
	else
	{
	    cout << "NO";
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}

3. 括号的匹配 3.0

3.1 审题

题目描述

假设一个表达式有英文字母(小写)、运算符( + + +, − - −, × \times ×, ÷ \div ÷)和左右小、中、大、尖括号构成,以" @ @ @"作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回"YES";否则返回"NO"。合法的括号:{[(<>)]}。假设表达式长度小于 255 255 255,左圆括号少于 100 100 100 个。

输入描述

包括一行数据,即表达式

输入文件为 bracket.in

输出描述

包括一行,即"YES"或"NO"

输出文件为 bracket.out

样例1

输入

复制代码
2*(x+y)/([1-x])*2)@

输出

复制代码
NO

3.2 参考答案

cpp 复制代码
#include <iostream>
#include <cstdio>
using namespace std;

char s[105];
char c;
int top;

int main() 
{
    freopen("bracket.in", "r", stdin);
    freopen("bracket.out", "w", stdout);
    
	while (cin >> c)
	{
	    if (c == '@')
	    {
	        break;
	    }
	    
	    if (c == '<')
	    {
	        s[++top] = c;
	    }
	    else if (c == '(')
	    {
	        if (s[top] == '<')
	        {
	            cout << "NO";
	            return 0;
	        }
	        else
	        {
	            s[++top] = c;
	        }
	    }
	    else if (c == '[')
	    {
	        if (s[top] == '(' || s[top] == '<')
	        {
	            cout << "NO";
	            return 0;
	        }
	        else
	        {
	            s[++top] = c;
	        }
	    }
	    else if (c == '{')
	    {
	        if (s[top] == '(' || s[top] == '[' || s[top] == '<')
	        {
	            cout << "NO";
	            return 0;
	        }
	        else
	        {
	            s[++top] = c;
	        }
	    }
	    else if (c == '>')
	    {
	        if (s[top] == '<')
	        {
	            top--;
	        }
	        else
	        {
	            cout << "NO";
	            return 0;
	        }
	    }
	    else if (c == ')')
	    {
	        if (s[top] == '(')
	        {
	            top--;
	        }
	        else
	        {
	            cout << "NO";
	            return 0;
	        }
	    }
	    else if (c == ']')
	    {
	        if (s[top] == '[')
	        {
	            top--;
	        }
	        else
	        {
	            cout << "NO";
	            return 0;
	        }
	    }
	    else if (c == '}')
	    {
	        if (s[top] == '{')
	        {
	            top--;
	        }
	        else
	        {
	            cout << "NO";
	            return 0;
	        }
	    }
	}
	
	if (top == 0)
	{
	    cout << "YES";
	}
	else
	{
	    cout << "NO";
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}
相关推荐
yi0118 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
禾小西11 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
H.莓飛11 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有12 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
chenbingjie_c13 小时前
C++ STL 适配器:stack & queue,从 vector/list 到 deque 深度解析
数据结构·c++
垆边人似月.16 小时前
华为OD算法题:查找众数及中位数
数据结构·算法·leetcode
CoderYanger17 小时前
一轮复习——F.动态规划模型总结(入门篇)
java·开发语言·数据结构·算法·leetcode·职场和发展·动态规划
一只旭宝18 小时前
数据结构与算法复习手册:从写过,到讲清楚
开发语言·数据结构·c++·算法
All for pursuit.19 小时前
【动态规划-1】121.买卖股票的最佳时机
数据结构·c++·算法·leetcode·动态规划
Logic10119 小时前
C语言/数据结构位运算题解:异或XOR找出优秀项目组中的“独特编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质