C++中的堆栈

版权声明:本文为博主原创文章,如需转载,请注明出处:http://blog.csdn.net/tina_ttl https://blog.csdn.net/tina_ttl/article/details/52778037

c++中提供了stack容器,它是STL中的很有用的容器之一,其中元素遵循先进后出!

stack类中包含以下几个成员函数:

  • empty() 堆栈为空则返回真
  • pop() 移除栈顶元素(不会返回栈顶元素的值)
  • push() 在栈顶增加元素
  • size() 返回栈中元素数目
  • top() 返回栈顶元素

下面是C++中关于堆栈的简单操作

# include <iostream>
# include <stack>

using namespace std;

void main()
{
    stack<int> st;

    // 产生一个堆栈st,由下至上的元素分别为1,2,3,4,5
    for (int i = 1; i <= 5; i++){
        st.push(i);
    }

    // 依次弹出堆栈中的元素并显示,分别为5,4,3,2,1
    for (int i = 1; i <= 5; i++) {
        cout << st.top() << endl;
        st.pop();
    }

    system("pause");

}

利用递归实现堆栈的反转

要反转一个栈,如果使用另外一个栈作为辅助的话,那么反转起来很简单,一个接一个push到辅助栈里再push回来就行了。那么假如不能使用辅助栈、数组等空间为O(n)的数据结构,只使用O(1)的空间复杂度(即只能有常数个变量),怎么实现将栈反转?即原来的栈顶在栈底,栈底变成栈顶。

递归算法不能考虑中间过程,上一层的递归可以直接使用下一层的递归结果,即假设下一层已经完成了我们的要求就行了,最后只需要考虑最后一层递归退出的条件就行了。

这里写图片描述

这里写图片描述
假设栈里面从栈底到栈顶存储的依次是 1 2 3 4 5,我们反转以后希望得到的结果是 5 4 3 2 1.

  • 第一步pop出来第一个数5,存到temp1中,此时的栈中由下到上是1 2 3 4。int temp1 = s.top();s.pop();
  • 递归调用自身,不用考虑具体的过程,我们只需要知道这个递归调用结束后得到的结果是使栈中的元素变成了由下到上 4 3 2 1(因为这个函数本身的意思就是反转栈)。reverseStack(s);
  • 此时pop出来第二个数1 ,存到temp2中,此时的栈中由下到上是 4 3 2。int temp2 = s.top();s.pop();
  • 再递归调用本身,抽象考虑这个递归完成后得到的结果是栈中的值变成了 2 3 4。reverseStack(s);
  • 接着我们把push(temp1),栈变成了 2 3 4 5。s.push(temp1);
  • 接着递归调用本身,递归完成后栈变成了 5 4 3 2。reverseStack(s);
  • 接着push(temp2)。好了,栈变成了 5 4 3 2 1,反转完成!s.push(temp2);

这里写图片描述

递归函数结束: 该函数的结束条件是当栈为空或者栈里只有一个元素的时候,return。

# include <iostream>
# include <stack>

using namespace std;

void reverseStack(stack <int> &s){

    // 首先处理递归的的停止条件,及堆栈中只有一个元素的情况
    if (s.empty())
        return;
    else {
        //如果s里面只有一个元素,就返回,否则就不返回。
        //具体实现是先pop出来一个,判断剩下的是不是空栈。
        int a = s.top();
        s.pop();
        if (s.empty()){
            s.push(a);
            return;
        }
        else{
            s.push(a);
        }
    }

    // 其他情况
    int temp1 = s.top();
    s.pop();
    reverseStack(s);
    int temp2 = s.top();
    s.pop();
    reverseStack(s);
    s.push(temp1);
    reverseStack(s);
    s.push(temp2);
}


void printStack(stack <int> st){
    while (!st.empty()){
        cout << st.top() << endl;/
        st.pop();
    }
}

void main(){

    // 产生一个堆栈,并由上指下显示堆栈内容
    stack<int> st;
    for (int i = 1; i <= 5; i++)
        st.push(i);//依次放入元素1,2,3,4,5
    cout << "反转前的元素(由上至下):"<<endl;
    printStack(st);

    // 反转堆栈
    reverseStack(st);

    cout << "反转后的元素(由上至下):" << endl;
    printStack(st);

    system("pause");



}

Reference
[1] http://blog.csdn.net/u012102306/article/details/52692906
[2] http://johnwaken.is-programmer.com/posts/14471

猜你喜欢

转载自blog.csdn.net/tina_ttl/article/details/52778037