以下通过一个题目来对栈的入栈,出栈,输出栈顶进行理解:
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
}
以下是对这段代码的简单说明:
-
引入必要的头文件
<iostream>
和<string>
,以便可以使用输入输出流和字符串处理功能。 -
使用
using namespace std;
命令,这样在代码中就不需要每次都使用std::
前缀来引用标准库中的对象。 -
定义常量
N
为 100005,这个值用于设定栈的最大容量。 -
声明一个整型数组
stack
,其大小为N
,这个数组将作为栈的存储结构。 -
定义变量
n
用于存储操作次数,num
用于存储待压栈的元素,top
作为栈顶指针,初始化为 -1 表示栈为空。 -
声明一个字符串变量
op
用于存储操作类型。 -
main
函数是程序的入口点。 -
通过
cin >> n;
读取操作次数。 -
使用一个
while
循环来执行n
次操作,每次循环读取一个操作类型op
。 -
根据
op
的值,执行以下操作之一:
- 如果
op
是 “push”,则读取一个整数num
并将其压入栈中,同时更新栈顶指针top
。 - 如果
op
是 “top”,则检查栈是否为空,如果不为空则输出栈顶元素,否则输出错误信息。 - 如果
op
是 “pop”,则同样检查栈是否为空,如果不为空则输出栈顶元素并将其弹出,同时更新栈顶指针,否则输出错误信息。
- 循环结束后,程序返回 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
}
下面是对代码的简要说明:
push(int n)
方法:将一个整数n
压入栈中。pop()
方法:从栈中弹出一个元素,并将其值存储在away
中。top()
方法:查看栈顶元素,并将其值存储在away
中,但不从栈中移除它。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++相关实现啦,如果作者有些地方讲错了欢迎评论区讨论并指正哦!