理解C++ STL栈实现的3个示例程序

举报
Tiamo_T 发表于 2021/09/30 16:17:56 2021/09/30
【摘要】 什么是栈?在我们的日常生活中,我们可能会看到一堆物品。例如:一叠盘子、叠在盘子上的煎饼、河内塔问题的棍子上的石头、一叠椅子、一叠书等。在编程语言中,堆栈是一种没有什么有趣属性的数据结构。它的元素在您获得它们时添加,并且您从添加到其中的最后一个元素清空堆栈。Stack 也称为 LIFO,代表“后进先出”。所以,第一个添加的元素最后出来,最后一个添加的成员先出来。该结构在软件开发或软件相关主题以...

什么是栈?

在我们的日常生活中,我们可能会看到一堆物品。例如:一叠盘子、叠在盘子上的煎饼、河内塔问题的棍子上的石头、一叠椅子、一叠书等。

在编程语言中,堆栈是一种没有什么有趣属性的数据结构。它的元素在您获得它们时添加,并且您从添加到其中的最后一个元素清空堆栈。

Stack 也称为 LIFO,代表“后进先出”。

所以,第一个添加的元素最后出来,最后一个添加的成员先出来。该结构在软件开发或软件相关主题以及硬件实现中可能经常出现的一些典型编程情况下是良好的。

堆栈实现策略

对于堆栈,有几种可能的实现方式,最常用的分类是基于堆栈的预测大小,我们正在使用。以下是堆栈的三种最常见的实现策略:

  1. * 第一个,称为有限大小的堆栈,通常使用数组和计数器来实现,该计数器知道您添加了多少元素,您还需要知道容量。
  2. * 第二个更有趣,它是通过结构体和指针实现的。它有时被称为“未知大小”的堆栈。第一个和第二个选项都可以在 C 和 C++ 编程语言中使用。
  3. * 第三种可能的解决方案是创建自己的类或模板类,使用很少的方法和重载运算符、友元方法等……

也可以有对象堆栈和指向对象的指针。但是,我们文章的重点将放在 STL 堆栈上。

如何使用 STL 堆栈?

为了使用 STL 堆栈,首先您需要在代码的开头添加“#include stack”。

这将使您能够在程序中使用堆栈。更准确地说,它是STL容器,它是用其他一些STL数据结构实现的,这使它成为一个适配器。

在此之后,您需要声明某种类型的堆栈,可以这样完成:

堆栈名称OfOurStack;

声明堆栈后,您可以应用几个成员函数。

如果您需要检查堆栈是否为空,您可以使用空成员函数,根据堆栈的状态返回 true 或 false。要使用它,你可以这样写:

nameOfOurStack.empty();

当您需要确定堆栈的大小时,您可以创建计数器,如果您添加元素,您会增加计数器,或者如果您从堆栈中删除元素,您会减少您的计数器。这应该通过大小来完成,即公共成员函数就在那里。这如下所示:

nameOfOurStack.size();

现在获得的元素已经添加到堆栈中,可以根据您的需要在您的程序中使用。

要访问我们的堆栈顶部,您将使用 top,它将从我们的堆栈顶部复制元素,但是它不会像您在开始时期望的那样从容器中删除它们。

nameOfOurStack.top();

如果您想从堆栈顶部删除元素,您可以使用 pop.

nameOfOurStack.pop();

为创建堆栈而烦恼:从用户那里获取元素,从文件中读取它们或者计算它们。要在堆栈顶部再添加一个元素,您可以像这样编码:

nameOfOurStack.push(someElement);

在 C++ 11 中,你也应该有 emplace。它将构造元素并将其添加到堆栈中。例如,您可以执行以下操作:

nameOfOurStack.emplace("Some string that will be added to stack of strings");

如果您想交换两个堆栈,从 C++ 11 开始,您也应该交换。

如果您尝试比较两个堆栈,您可能还需要一些非常有用的关系运算符。

STL 堆栈示例程序 #1

我们的第一个示例将说明如何创建少量整数的堆栈以及如何对其执行一些基本操作。

#include <iostream>
#include <stack>

using namespace std;

int
main()
{
stack<int> nStack;

cout<<"NOW YOU HAVE STACK !!!"<<endl;

cout<<"The size is="
<<nStack.size()<<endl;
cout<<"The stak ";
(nStack.empty()==true)?cout<<" is " : cout<<" it is not ";
cout<<" empty "<<endl;

cout<<"\n\nNOW YOU ADD TWO INT-S TO IT!!!"<<endl;

nStack.emplace(1);
nStack.push(2);
cout<<"The size is="
<<nStack.size()<<endl;
cout<<"The stack ";
(nStack.empty()==true)?cout<<" is " : cout<<" it is not ";
cout<<" empty "<<endl;

int nElement =nStack.top();
cout<<"The size is="
<<nStack.size()<<endl;
cout<<"The stack ";
(nStack.empty()==true)?cout<<" is " : cout<<" it is not ";
cout<<" empty "<<endl;

cout<<"\n\nWE HAVE TAKEN TOP ELEMENT!!!"<<endl;
nStack.pop();
cout<<"The size is="
<<nStack.size()<<endl;
cout<<"The stack ";
(nStack.empty()==true)?cout<<" is " : cout<<" it is not ";
cout<<" empty "<<endl;

nStack.pop();

return EXIT_SUCCESS;
}

STL 堆栈示例程序 #2

我们的第二个例子将解释如何创建字符串堆栈。

#include <iostream>
#include <stack>
#include <string>

using namespace std;
int
main()
{
stack<string> sStack;

for(;;)
{
 char cPick;
 cout<<"Would you like to add new string y/n->";
 cin>>cPick;
 if(cPick=='n') break;

 cout<<"Next string plase->";
 string sTemp;
 cin>>sTemp;
 sStack.emplace(sTemp);
 cout<<endl;
}

while(!sStack.empty())
{
 //YES, AND NEGATION WILL TAKE SOME TIME!
 string sTemp;
 //FIRST WE TAKE COPY AND THEN WE TAKE FROM TOP OF THE STRING
 sTemp=sStack.top(); sStack.pop();
 cout<<sTemp<<endl;
}

return EXIT_SUCCESS;
}

STL 堆栈示例程序 #3

第三个也是最后一个示例将向您展示如何将十进制数转换为其等效的二进制数。

#include <iostream>
#include <stack>

typedef unsigned long long int myType;

using namespace std;

int
main()
{

cout<<"WE WILL CONVERT NUMBER INTO BINARY EQUIVALENT"<
//PREPARE SPACE FOR NUMBER WE INPUT
myType temp;
cout<<"Please, input the number->";
cin>>temp;

//LET'S DECLARE STACK
stack <int> nBinaryNumber;

//FIND BINARY CIPHERS
while(temp)
{
 int nCipher = temp%2;
 nBinaryNumber.emplace(nCipher);
 temp/=2;
}

//PRESENT THE STACK
while(!nBinaryNumber.empty())
{
 (nBinaryNumber.top()==1)?cout<<'1':cout<<'0';
 nBinaryNumber.pop();
}

return EXIT_SUCCESS;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。