美文网首页
数据结构之栈

数据结构之栈

作者: Pig_deng饲养员 | 来源:发表于2020-09-02 10:15 被阅读0次

栈:具有数据先入后出,先出后入的特性。
从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。
当某个数据集合只涉及在一端插入和删除数据,并且满足后进先出、先进后出的特性,我们就应该首选“栈”这种数据结构。
栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。

用数组实现顺序栈

C代码结构体实现

#include<stdio.h>

#define maxsize 100

typedef struct{
    int data[maxsize];
    int topindex;
}SeqStack;

void push(SeqStack &stack, int value)
{
    if(stack.topindex == maxsize){
        printf("stack is full \n");
    }else{
        stack.data[stack.topindex] = value;
        stack.topindex++;
    }
}

void pop(SeqStack &stack)
{
    if(stack.topindex == 0){
        printf("stack is empty\n");
    }else{
        printf("pop %d\n", stack.data[--stack.topindex]);
    }
}

int isEmpty(SeqStack &stack)
{
    if(stack.topindex == 0){
        printf("stack is empty\n");
        return 1;
    }else{
        printf("stack is not empty \n");
        return 0;
    }
}

int main()
{
    SeqStack stack;
    stack.topindex = 0;
    
    push(stack, 5);
    push(stack, 4);
    push(stack, 3);
    pop(stack);
    pop(stack);
    isEmpty(stack);
    pop(stack);
    isEmpty(stack);
    pop(stack);
        
    
    return 0;
}

运行结果

pop 3
pop 4
stack is not empty
pop 5
stack is empty
stack is empty

c++类对象实现栈

#include<iostream>
using std::cout;
using std::cin;
using std::endl;

class Stack{
    private:
        int *data_;
        int max_size_;
        int top_;
        
        void initStack(){
            data_ = new int(max_size_);
            top_ = -1;
        }
    
    public:
        Stack(){
            max_size_ = 10;
            initStack();
        }
        
        Stack(int max_size){
            max_size_ = max_size;
            initStack();
        }
        
        ~Stack(){
            delete data_;
        }
        
        int isEmpty(){
            return (top_ == -1) ? 1:0;
        }
        
        int isFull(){
            return (top_ >= max_size_) ? 1:0;
        }
        
        int push(int x){
            if(isFull()) return 0;
            else data_[++top_] = x;
            
            return 1;
        }
        
        int pop(int &x){
            if(isEmpty()) return 0;
            else x = data_[top_--];
            
            return x;
        }
        
        void clear(){
            top_ = -1;
        }
};

int main()
{
    Stack stack(12);
    stack.push(123);
    stack.push(123);
    stack.push(456);
    int a;
    while(stack.pop(a)) {
        cout<<a<<endl;
    }
    return 0;
}

支持动态扩容的栈

当栈是由数组构建时,栈的内存有一定的限制。当栈内存满时,我们需要对栈进行动态扩容,这里只需要依赖一个可以动态扩容的数组即可,一个动态扩容的数组是当数组空间不够时,我们就重新申请一块更大的内存,将原来数组中数据统统拷贝过去。这样就实现了一个支持动态扩容的数组。因此动态扩容的栈就是当栈满了之后,我们就申请一个更大的数组,将原来的数据搬移到新数组中。

栈的应用

  1. 函数调用
  2. 表达式求值:使用两个栈,一个存储操作数,一个存储符合
  3. 括号匹配:栈来存储未匹配的左括号,扫描到右括号时,左括号出栈并匹配。
  4. 实现浏览器的前进和后退

相关文章

  • Android面试题总结(题目+复习链接)

    数据结构 1.栈实现原理 java数据结构与算法之栈(Stack)设计与实现 - CSDN博客 2.链表实现原理 ...

  • 数据结构之栈 原理 栈是一种比较常见的数据结构,它的操作可以看做是数组的子集,因为栈只能从栈顶取元素和添加元素,并...

  • 数据结构之---栈

    数据结构之---栈 顺序栈 内部采用数组实现 结构图; 定义结构体: 函数声明 进栈以及出栈 图示: 其余操作 链...

  • Activity启动模式精讲

    讲解本技术点之前需要准备的技术点回顾 栈数据结构 数据结构图文解析之:栈的简介及C++模板实现 - melonst...

  • 数据结构之栈的链式存储结构

    之前写了栈的顺序存储结构,对栈的定义和操作进行了说明 数据结构之栈的顺序存储结构 现在接着写栈的链式存储结构 栈的...

  • 栈和队列

    1、栈 栈是一种先进先出的数据结构。栈顶进栈,栈顶出栈。 数据结构 栈的初始化 进栈 出栈 栈的最小值 2、队列 ...

  • Java 基础 35 数据结构和ArrayList集合的相关案例

    1.1 数据结构 什么是数据结构?数据的组织方式.维基百科 1.1.1 常见数据结构之栈和队列 1.1.2常见数据...

  • 实战PHP数据结构基础之栈

    栈和队列 栈和队列和之前讲到的实战PHP数据结构基础之双链表 一样都是线性结构。 栈有什么特点 栈遵循后进先出的原...

  • 004 go语言实现栈

    1 数据结构 数据结构: 要实现的功能:0 栈的初始化1 获取栈长度2 入栈3 出栈4 清空栈内容5 判断栈是否为...

  • java高级知识点

    1.数据结构 程序=数据结构+算法 栈:后进先出,线性结构 入栈:push 出栈:pop假如已知入栈顺序是ab...

网友评论

      本文标题:数据结构之栈

      本文链接:https://www.haomeiwen.com/subject/lzvcuhtx.html