栈的简单入栈,出栈,输出栈顶的实现

以下通过一个题目来对栈的入栈,出栈,输出栈顶进行理解:

1.题目描述

请你实现一个栈。

操作:

push x:将 x加入栈,保证 x 为 int 型整数。

pop:输出栈顶,并让栈顶出栈

top:输出栈顶,栈顶不出栈

1.1输入描述:

第一行为一个正整数 n ,代表操作次数。(1≤n≤100000)

接下来的 n ,每行为一个字符串,代表一个操作。保证操作是题目描述中三种中的一种。

1.2输出描述:

如果操作为push,则不输出任何东西。

如果为另外两种,若栈为空,则输出 "error“

否则按对应操作输出。

2.使用数组解决:

#include <iostream>    // 引入输入输出流库,用于标准输入输出
#include <string>    // 引入字符串库,用于处理字符串
using namespace std;    // 使用标准命名空间

const int N = 1e5 + 5;  // 定义常量N,作为栈的最大容量,1e5+5即100005
int stack[N];             // 定义一个整型数组stack,作为栈的存储结构
int n,num, top = -1;    // 定义变量n为操作次数,num为待压栈的元素,top为栈顶指针,初始化为-1表示栈为空

string op;              // 定义字符串变量op,用于存储操作类型

int main()              // 主函数,程序入口
{
    cin >> n;           // 读取操作次数
    while (n--) {       // 循环执行n次操作
        cin >> op;       // 读取操作类型
        if (op == "push") { // 如果操作类型是"push"
            cin >> num;      // 读取要压栈的元素
            stack[++top] = num; // 将元素num压入栈中,并更新栈顶指针,注意是先将元素入栈再++
        } else if (op == "top") { // 如果操作类型是"top"
            if (top == -1) {    // 检查栈是否为空
                cout << "error" << endl; // 如果栈为空,输出错误信息
            } else {
                cout << stack[top] << endl; // 如果栈不为空,输出栈顶元素
            }
        } else if (op == "pop") { // 如果操作类型是"pop"
            if (top == -1) {     // 检查栈是否为空
                cout << "error" << endl; // 如果栈为空,输出错误信息
            } else {
                cout << stack[top] << endl; // 如果栈不为空,输出栈顶元素
                top--;                   // 更新栈顶指针,表示弹出栈顶元素
            }
        }
    }
    
    return 0; // 程序结束,返回0
}

以下是对这段代码的简单说明:

  1. 引入必要的头文件 <iostream> 和 <string>,以便可以使用输入输出流和字符串处理功能。

  2. 使用 using namespace std; 命令,这样在代码中就不需要每次都使用 std:: 前缀来引用标准库中的对象。

  3. 定义常量 N 为 100005,这个值用于设定栈的最大容量。

  4. 声明一个整型数组 stack,其大小为 N,这个数组将作为栈的存储结构。

  5. 定义变量 n 用于存储操作次数,num 用于存储待压栈的元素,top 作为栈顶指针,初始化为 -1 表示栈为空。

  6. 声明一个字符串变量 op 用于存储操作类型。

  7. main 函数是程序的入口点。

  8. 通过 cin >> n; 读取操作次数。

  9. 使用一个 while 循环来执行 n 次操作,每次循环读取一个操作类型 op

  10. 根据 op 的值,执行以下操作之一:

  • 如果 op 是 “push”,则读取一个整数 num 并将其压入栈中,同时更新栈顶指针 top
  • 如果 op 是 “top”,则检查栈是否为空,如果不为空则输出栈顶元素,否则输出错误信息。
  • 如果 op 是 “pop”,则同样检查栈是否为空,如果不为空则输出栈顶元素并将其弹出,同时更新栈顶指针,否则输出错误信息。
  1. 循环结束后,程序返回 0,表示正常结束。

这段代码实现了一个简单的基于数组的栈,并能够处理基本的栈操作,包括压栈、查看栈顶元素和出栈。如果栈为空时尝试进行 “top” 或 “pop” 操作,程序将输出错误信息。

3.使用vector容器解决:

如果不知道vector容器是什么的可以去看:

C++ vector的常见用法详解(超详细)\(^o^)/~_vector c++ 用法-优快云博客

这位博主讲的很详细。

至于为什么使用vector是因为vector自带push_back(),empty(),pop_back()函数更加方便。

push_back():往容器中插入一个元素。(插在末尾)

pop_back():删除容器中最后一个元素。

empty():检查容器中是否还有元素,有返回true,无则返回false。

代码如下:

#include <iostream> // 引入输入输出流库,用于标准输入输出
#include <vector>   // 引入向量库,用于实现动态数组
#include <string>   // 引入字符串库,用于处理字符串

using namespace std; // 使用标准命名空间,避免在代码中使用std::

// 定义一个栈类
class Stack {
public: // 公有成员,外部可以访问
    vector <int> elems; // 动态数组,用于存储栈的元素
    long int away = 0; // 长整型变量,用于存储出栈或查看栈顶元素的值

    // 成员函数声明
    void push(int n); // 压栈操作
    void pop();       // 出栈操作
    void top();       // 查看栈顶元素操作
    void awayprint(); // 打印away变量的值
};

// push成员函数定义,用于将元素n压入栈中
void Stack::push(int n) {
    elems.push_back(n); // 将n添加到向量elems的末尾
}

// pop成员函数定义,用于从栈中弹出一个元素
void Stack::pop() {
    away = elems.back(); // 将栈顶元素的值赋给away
    elems.pop_back();    // 删除向量elems的最后一个元素
}

// top成员函数定义,用于查看栈顶元素
void Stack::top() {
    away = elems.back(); // 将栈顶元素的值赋给away,但不删除元素
}

// awayprint成员函数定义,用于打印away变量的值
void Stack::awayprint() {
    cout << away << endl; // 输出away的值并换行
}

// main函数,程序入口
int main() {
    Stack stack; // 创建一个Stack对象
    long int n;  // 用于存储操作次数
    int num;     // 用于存储待压栈的数字
    string op;   // 用于存储操作类型

    cin >> n; // 读取操作次数
    while (n--) { // 循环执行n次操作
        if (cin >> op) { // 读取操作类型
            if (op == "push") { // 如果操作是压栈
                cin >> num;   // 读取要压栈的数字
                stack.push(num); // 调用push方法压栈
            }
            else if (op == "pop") { // 如果操作是出栈
                if (stack.elems.empty()) // 检查栈是否为空
                    cout << "error" << endl; // 如果为空,输出错误信息
                else {
                    stack.pop(); // 调用pop方法出栈
                    stack.awayprint(); // 打印出栈的元素
                }
            }
            else if (op == "top") { // 如果操作是查看栈顶元素
                if (stack.elems.empty()) // 检查栈是否为空
                    cout << "error" << endl; // 如果为空,输出错误信息
                else {
                    stack.top(); // 调用top方法查看栈顶元素
                    stack.awayprint(); // 打印栈顶元素
                }
            }
        }
    }
    return 0; // 程序结束,返回0
}

下面是对代码的简要说明:

  1. push(int n) 方法:将一个整数 n 压入栈中。
  2. pop() 方法:从栈中弹出一个元素,并将其值存储在 away 中。
  3. top() 方法:查看栈顶元素,并将其值存储在 away 中,但不从栈中移除它。
  4. awayprint() 方法:打印 away 的值。

main 函数中,程序首先创建了一个 Stack 对象,然后读取一个整数 n,表示接下来会有 n 个操作。对于每个操作,程序读取一个字符串 op 来决定执行哪种栈操作:

  • 如果 op 是 "push",则程序还会读取一个整数 num 并将其压入栈中。
  • 如果 op 是 "pop",并且栈不为空,则从栈中弹出一个元素并打印它的值。如果栈为空,则打印 "error"
  • 如果 op 是 "top",并且栈不为空,则打印栈顶元素的值。如果栈为空,则打印 "error"

4.总结: 

使用while(n--){}可以控制循环的次数进而控制数据输入次数,使用数组则可以通过top==-1来检测栈中是否还有元素,对于vector容器则只需使用库中自带的empty()函数对容器元素进行行检测,if(){}else{}则可以对于不同的指令做出相应的的操作。

以上就是关于栈顶入栈,出栈,输入栈顶元素的c++相关实现啦,如果作者有些地方讲错了欢迎评论区讨论并指正哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值