链式栈的综合操作(创建、出入栈、取栈顶、判栈空)C++实现

对于栈的概念、图示以及顺序栈的实现我在上一篇博客进行了讲解和代码共享。如果大家需要看顺序栈的综合操作可以看我的上一篇博客。
http://blog.csdn.net/zxnsirius/article/details/51206766

这里主要给大家讲一下链式栈的操作:
首先说一下链式栈与顺序栈的区别


  • 顺序栈与链式栈的相同点。都是只能存栈顶获取或者插入元素。且二者的时间复杂度都是相同的O(1);
  • 顺序栈和链式栈的不同点是,顺序栈的栈空间是静态的也就是说需要首先自动分配好,如果多了会浪费空间,少了又会怕不够用,这是顺序栈的最致命的缺点。而我们链式栈正好解决了这个问题,它采用动态分配内存空间,每当有一个元素需要进行入栈,则为该元素分配一个空间。不多不少不浪费,刚刚好。

说了这么多,那么链式栈该如何实现呢。我们可以先想一下单链表的头插。看下面的例子

/* 单链表的头插 */
1、head->null;
2、head->node1->null;
3、head->node2->node1->null;
//大家有没有发现这和我们的栈的存储方式很像?
//几乎就是栈,如果你把head想象成栈顶。null想象成栈底
/* 哈哈,就说这么多,直接看代码 */
...
/********************************************************* - Copyright (C): 2016 - File name : linkstack.cpp - Author : - Zhaoxinan - - Date : 2016年04月21日 星期四 10时54分21秒 - Description : 链式栈的综合操作 * *******************************************************/
#include <iostream>
#include <cstdlib>

typedef struct stack
{
    int num;
    struct stack *next;
}Sqstack;
typedef Sqstack* Stack;

/* 创建栈 */
void create_stack(Stack *top)
{
    *top = NULL;
}

/* 判断栈是否为空 */
int stack_empty(Stack *top)
{
    /* 如果栈为空则返回 1 */
    return (*top == NULL); 
}

/* 入栈 top->null; top->new1->null; top->new2->new1->null; */
void push_stack(Stack *top, Stack *newnode)
{
    (*newnode)->next = *top;
    *top = (*newnode);
}

/* 出栈,将栈顶元素传递给popnum,若栈空则popnum = -1 */
void pop_stack(Stack *top, int *popnum)
{
    if (stack_empty(top) == 1)
    {
        std::cout << " 当前栈空" << std::endl;
        *popnum = -1;   
        return ;
    }
    /* 创建一个临时变量,用于释放top节点 */
    Stack temp = *top;
    *popnum = (*top)->num;
    (*top) = (*top)->next; 

    delete(temp);
    temp = NULL;
}

/* 取得栈顶元素,若栈空则栈顶元素为 -1 */
void get_top_stack(Stack *top, int *topnum)
{
    /* 判断栈空 */
    if (stack_empty(top) == 1)
    {
        std::cout << " 当前栈空" << std::endl;
        *topnum = -1;
        return ;
    }
    *topnum = (*top)->num;
}
/* 主函数 */
int main()
{
    using namespace std;

    Stack top;      //栈顶
    Stack newnode;  //新结点

    create_stack(&top);

    /* 取得当前栈顶元素 */ 
    int topnum;
    get_top_stack(&top, &topnum);
    cout << " 当前栈顶top = " << topnum << endl;

    cout << "_________________入栈_________________\n";
    for (int i = 0; i < 10; i++)
    {
        newnode = new Sqstack;
        if (newnode == NULL)
        {
            cout << "newnode new error!\n";
            exit(1);
        }
        newnode->num = i;

        push_stack(&top, &newnode);   //入栈
        cout << "第 " << i << "个入栈的元素是 " << i;

        /*取得当前栈顶元素*/
        int topnum;
        get_top_stack(&top, &topnum);
        cout << " 当前栈顶top = " << topnum  << endl;
    }

    cout << endl << "_______________出栈________________\n";
    for (int i = 0; i < 10; i++)
    {
        int popnum;

        pop_stack(&top, &popnum);
        cout << "第 " << i << "个出栈的元素是 " << popnum;

        /*取得当前栈顶元素*/
        int topnum;
        get_top_stack(&top, &topnum);
        cout << " 当前栈顶top = " << topnum << endl;
    }

    return 0;
}

程序运行结果截图如下:

链式栈的综合操作(创建、出入栈、取栈顶、判栈空)C++实现_第1张图片

希望可以帮助到你!

你可能感兴趣的:(链表栈与顺序栈的区别,C++链式栈综合操作,出入栈)