【18. 模拟栈和队列】

简介: 模拟栈**特点**:栈是先进后出。模拟队列**特点**:先进先出。

模拟栈

特点:栈是先进后出。

#include <iostream>
usign namespace std;
const int N = 100010;
int stk[N], tt;       //tt表示栈顶,初始值设为0

                      //插入
stk[++ tt] = x;

                      //弹出
tt --;

                      //判断栈是否为空
if(tt > 0) not empty
else empty
    
                      //栈顶
stk[tt];

题目

实现一个栈,栈初始为空,支持四种操作:

  1. push x – 向栈顶插入一个数 x;
  2. pop – 从栈顶弹出一个数;
  3. empty – 判断栈是否为空;
  4. query – 查询栈顶元素。

现在要对栈进行 M 个操作,其中的每个操作 3 和操作 4 都要输出相应的结果。

输入格式

第一行包含整数 M,表示操作次数。

接下来 M 行,每行包含一个操作命令,操作命令为 push xpopemptyquery 中的一种。

输出格式

对于每个 emptyquery 操作都要输出一个查询结果,每个结果占一行。

其中,empty 操作的查询结果为 YESNOquery 操作的查询结果为一个整数,表示栈顶元素的值。

数据范围

1 ≤ M ≤ 100000
1 ≤ x ≤ 109
所有操作保证合法。

输入样例:

10
push 5
query
push 6
pop
query
pop
empty
push 4
query
empty

输出样例:

5
5
YES
4
NO

代码

#include <iostream>
#include <string>
using namespace std;

const int N = 100010;
int stk[N], tt;    // tt 表示栈顶,初始为0

//插入
void push(int x)
{
stk[ ++ tt] = x;
}


//弹出
void pop()
{
tt --;
}


//判断栈是否为空

void empty()
{
if (tt > 0)  cout << "NO" << endl;
else cout << "YES" << endl;
}


//栈顶
void query()
{
stk[tt]; 
cout << stk[tt] << endl;
}

int main()
{
int m;
cin >> m;
while (m --)
{
  int x;
      string op;
      cin >> op;
      if (op == "push")
      {
          cin >>x;
          push(x);

      }
      else if (op == "query")
      {
          query();

      }
      else if (op == "pop")
      {
          pop();
      }
      else
      {
          empty();
      }
}


}

模拟队列

特点:先进先出。

//在队尾插入元素,在对头取出元素
int q[N], hh, tt = -1;   //tt代表队头,hh代表队尾  对头初始值设置为-1,也可以向栈一样设置为0

//插入
q[ ++ tt] = x;

//弹出
hh ++;

//判断队列是否为空
if (hh <= tt) not empty
else empty
    
//取出队头元素
 q[hh]
//取出队尾元素
 q[tt]

1661151677340.png

题目

实现一个队列,队列初始为空,支持四种操作:

  1. push x – 向队尾插入一个数 x;
  2. pop – 从队头弹出一个数;
  3. empty – 判断队列是否为空;
  4. query – 查询队头元素。

现在要对队列进行 M 个操作,其中的每个操作 3 和操作 4 都要输出相应的结果。

输入格式

第一行包含整数 M,表示操作次数。

接下来 M 行,每行包含一个操作命令,操作命令为 push xpopemptyquery 中的一种。

输出格式

对于每个 emptyquery 操作都要输出一个查询结果,每个结果占一行。

其中,empty 操作的查询结果为 YESNOquery 操作的查询结果为一个整数,表示队头元素的值。

数据范围

1 ≤ M ≤ 100000
1 ≤ x ≤ 109
所有操作保证合法。

输入样例:

10
push 6
empty
query
pop
empty
push 3
push 4
pop
query
push 6

输出样例:

NO
6
YES
4

代码

#include <iostream>
#include <string>
using namespace std;

const int N = 100010;
int q[N], hh, tt = -1;

//插入
void push(int x)
{
   q[ ++ tt]  =x;
}


//弹出
void pop()
{
   hh ++;
}


//判断是否为空
void empty()
{
   if (hh <= tt)  cout << "NO" << endl;
   else cout << "YES" << endl;
}



//取出队头元素
void query()
{
   q[hh];
   cout << q[hh] << endl;
   
}

int main()
{
  
   int m;
   cin >> m;
   while (m --)
   {
       string op;
       cin >> op;
       int x;
       if (op == "push")
       {
           cin >> x;
           push(x);
       }
       else if (op == "pop")
       {
           pop();
       }
       else if (op == "empty")
       {
           empty();
       }
       else
       {
           query();
       }
   }
   return 0;
}
目录
相关文章
|
5天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
64 9
|
2天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
4天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
26 4
|
8天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
22天前
数据结构(栈与列队)
数据结构(栈与列队)
16 1
|
26天前
|
存储 JavaScript 前端开发
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
为什么基础数据类型存放在栈中,而引用数据类型存放在堆中?
61 1
|
22天前
【数据结构】-- 栈和队列
【数据结构】-- 栈和队列
13 0
|
27天前
探索数据结构:队列的的实现与应用
探索数据结构:队列的的实现与应用
|
27天前
探索顺序结构:栈的实现方式
探索顺序结构:栈的实现方式
|
28天前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
26 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器