zoukankan      html  css  js  c++  java
  • 【数据结构】顺序栈

      利用顺序存储方式实现的栈称为顺序栈。类似于顺序表的定义,栈中的数据元素用一个预设的足够长度的一维数组来实现:datatype data[MAXSIZE],栈底位置可以设置在数组的任一个端点,而栈顶是随着插入和删除而变化的,用一个 int top 来作为栈顶的指针,指明当前栈顶的位置,同样将 data 和 top 封装在一个结构中。

      顺序栈的类型描述如下:

    typedef struct {
        datatype data[MAXSIZE];
        int top;
    }seqStack;

      定义一个指向顺序栈的指针:

    SeqStack *s;

      通常0下标端设为栈底,这样空栈时栈顶指针 top=-1;入栈时,栈顶指针加1,即 s->top++;出栈时栈顶指针减1,即 s->top--。

      以下是栈的几种基本操作:

      (1) 置空栈

    seqStack *init_seqStack() {
        seqStack *s;
    
        s = (seqStack *)malloc(sizeof(seqStack));
        s->top = -1;
    
        return s;
    }

      (2) 判栈空

    int empty_seqStack(seqStack *s) {
        if (s->top == -1) {
            return TRUE;
        }
        return FALSE;
    }

      (3) 判栈满

    int full_seqStack(seqStack *s) {
        if (s->top == MAXSIZE - 1) {
            return TRUE;
        }
        return FALSE;
    }

      (4) 入栈

    int push_seqStack(seqStack *s, int x) {
        if (full_seqStack(s)) {
            return FAILURE;
        }
    
        s->top++;
        s->data[s->top] = x;
    
        return SUCCESS;
    }

      (5) 出栈

    int pop_seqStack(seqStack *s, int *x) {
        if (empty_seqStack(s)) {
            return FAILURE;
        }
    
        *x = s->data[s->top];
        s->top--;
    
        return SUCCESS;
    }

      (6) 取栈顶元素

    int gettop_seqStack(seqStack *s, int *x) {
        if (empty_seqStack(s)) {
            return FAILURE;
        }
    
        *x = s->data[s->top];
    
        return SUCCESS;
    }

      (7) 释放空间

    void free_seqStack(seqStack **s) {
        if (*s == NULL) {
            return;
        }
        free(*s);
        *s = NULL;
    }

      这里我们定义一个测试函数 test_seqStack() 来了解一下顺序栈是如何操作的,测试时 datatype 定义为 int 类型。

      我们先定义一个头文件 seqStack.h。

    /**********************************************
    ** file name   : seqStack.h
    ** description :
    ** writer by   : Adam
    ** create date : 2016-10-22
    **********************************************/
    
    #ifndef SEQSTACK_H
    #define SEQSTACK_H
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    
    #define TRUE 1
    #define FALSE 0
    
    #define SUCCESS 1
    #define FAILURE 0
    
    #define MAXSIZE 100
    typedef struct {
        int data[MAXSIZE];
        int top;
    }seqStack;
    
    seqStack *init_seqStack();                                                // 置空栈
    int empty_seqStack(seqStack *s);                                        // 判栈空
    int full_seqStack(seqStack *s);                                            // 判栈满
    int push_seqStack(seqStack *s, int x);                                    // 入栈
    int pop_seqStack(seqStack *s, int *x);                                    // 出栈
    int gettop_seqStack(seqStack *s, int *x);                                // 取栈顶元素
    void show_seqStack(seqStack *s);                                        // 输出
    void free_seqStack(seqStack **s);                                        // 释放空间
    void test_seqStack();
    
    #endif //SEQSTACK_H
    /********************END**********************/

      然后定义一个 seqStack.cpp 文件。

    /**********************************************
    ** file name   : seqStack.cpp
    ** description :
    ** writer by   : Adam
    ** create date : 2016-10-22
    **********************************************/
    
    #include "seqStack.h"
    
    void test_seqStack() {
        seqStack *s;
        int i, x;
    
        s = init_seqStack();
        show_seqStack(s);
    
        for (i = 1; i <= 101; i++) {
            if (push_seqStack(s, i) == FAILURE) {
                printf("Stack overflowed!
    ");
                _getch();
                break;
            }
        }
        show_seqStack(s);
    
        if (pop_seqStack(s, &x) == FAILURE) {
            printf("Stack empty!");
            _getch();
        }
        else
        {
            printf("Pop Stack=%d
    ", x);
        }
        show_seqStack(s);
    
        if (gettop_seqStack(s, &x) == FAILURE) {
            printf("Get top of Stack failed!
    ");
            _getch();
        }
        else
        {
            printf("Top Stack=%d
    ", x);
        }
        show_seqStack(s);
    
        free_seqStack(&s);
    }
    
    seqStack *init_seqStack() {
        seqStack *s;
    
        s = (seqStack *)malloc(sizeof(seqStack));
        s->top = -1;
    
        return s;
    }
    
    int empty_seqStack(seqStack *s) {
        if (s->top == -1) {
            return TRUE;
        }
        return FALSE;
    }
    
    int full_seqStack(seqStack *s) {
        if (s->top == MAXSIZE - 1) {
            return TRUE;
        }
        return FALSE;
    }
    
    int push_seqStack(seqStack *s, int x) {
        if (full_seqStack(s)) {
            return FAILURE;
        }
    
        s->top++;
        s->data[s->top] = x;
    
        return SUCCESS;
    }
    
    int pop_seqStack(seqStack *s, int *x) {
        if (empty_seqStack(s)) {
            return FAILURE;
        }
    
        *x = s->data[s->top];
        s->top--;
    
        return SUCCESS;
    }
    
    int gettop_seqStack(seqStack *s, int *x) {
        if (empty_seqStack(s)) {
            return FAILURE;
        }
    
        *x = s->data[s->top];
    
        return SUCCESS;
    }
    
    void show_seqStack(seqStack *s) {
        int i;
    
        if (empty_seqStack(s)) {
            printf("The stack is empty!
    ");
            _getch();
            return;
        }
    
        for (i = s->top; i >= 0; i--) {
            printf("%d	", s->data[i]);
        }
    
        printf("
    show finished!
    ");
        _getch();
    }
    
    void free_seqStack(seqStack **s) {
        if (*s == NULL) {
            return;
        }
        free(*s);
        *s = NULL;
    }
    
    /********************END**********************/

      最后再通过主函数来调用 seqStack.cpp 函数。

    /**********************************************
    ** file name   : main.cpp
    ** description :
    ** writer by   : Adam
    ** create date : 2016-10-22
    **********************************************/
    
    #include "seqStack.h";
    
    void main() {
        test_seqStack();
    }
    
    /********************END**********************/

      运行结果如下:

      

      借此我们就可以直观的看出栈的运行状态及过程。

     

      注意以下几点:

      (1) 对于顺序栈,入栈时,首先判断栈是否满了,栈满的条件为: s->top == MAXSIZE-1,栈满时,不能入栈;否则出现空间溢出,引起错误,这种现象称为上溢。

      (2) 出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作否则产生错误。通常栈空时常作为一种控制转移的条件。

      (3) 取栈顶元素与出栈的不同之处在于出栈操作改变栈顶指针 top 的位置(栈顶指针下移一个位置),而取栈顶元素操作只是读出栈顶元素的值,栈顶指针 top 位置不改变。

  • 相关阅读:
    GMM的EM算法
    SQL Server 有关EXCEPT和INTERSECT使用
    nginx.conf 完整的集群配置
    一些建议方案猿简历
    漫游Kafka实战篇clientAPI
    iPhone发展【一】从HelloWorld开始
    SpringMVC+Spring3+Hibernate4开发环境的搭建
    tar.gz文件命名和压缩解压方法
    贪心算法(Greedy Algorithm)最小生成树 克鲁斯卡尔算法(Kruskal&#39;s algorithm)
    微软将彻底改变Windows发布方式
  • 原文地址:https://www.cnblogs.com/adamjwh/p/6476384.html
Copyright © 2011-2022 走看看