栈的简单实现(1)-数组实现

引言

栈(stack)是一种被广泛使用的线性数据结构,它只允许在表的一端进行插入或删除操作,因而栈也可以被称作为操作受限的线性表 。在栈中,允许插入或删除的一端称作栈顶(top)不允许插入和删除的另一端称作栈底(bottom);

示意图如下:

此文借助数组简单地实现栈及其基本操作。

代码如下:

#define MaxSize 100
typedef struct{
    int data[MaxSize];
    int top;
}SeqStack;

注:这里假设栈中储存的是整型 (int) 的数据

基本操作

1.栈的初始化

void init(SeqStack* s)
{
    s->top = -1;     //数组下标从0开始,因而这里表示栈为空
}

2.进栈

void push(SeqStack* s, int x)
{
    if(s->top<MaxSize-1)   //栈未满才能进栈
      s->data[++(s->top)] = x;
}

3.出栈

int  pop(SeqStack* s)
{
    if(s->top>-1)   //栈不为空才能出栈
      return (s->data[s->top--]);

}

4.清空栈

void clear(SeqStack* s)
{
    s->top = -1;
}

5.判断栈是否为空

bool isEmpty(SeqStack* s)
{
    if(s->top==-1){
        return true;
    }else{
        return false;
    }
}

6.求栈的长度

int length(SeqStack* s)
{
    return (s->top+1);
}

进行测试:

int main(void)
{

    SeqStack s;
    init(&s);
    push(&s, 1);
    push(&s, 2);
    push(&s, 3);
    printf("%d\n", length(&s));

    if(isEmpty(&s)){
        printf("栈为空\n");
    }else{
        printf("栈不为空\n");
    }

    printf("%d\n", pop(&s));
    printf("%d\n", pop(&s));
    printf("%d\n", pop(&s));

    if(isEmpty(&s)){
        printf("栈为空\n");
    }else{
        printf("栈不为空\n");
    }

    push(&s, 3);
    clear(&s);
    if(isEmpty(&s)){
        printf("栈为空\n");
    }else{
        printf("栈不为空\n");
    }    

    return 0;
}

测试结果:

完整代码

#include<stdio.h>
#define MaxSize 100
typedef struct{
    int data[MaxSize];
    int top;
}SeqStack;

void init(SeqStack* s);
bool isEmpty(SeqStack* s);
void push(SeqStack* s, int x);
int  pop(SeqStack* s);
void clear(SeqStack* s);
int length(SeqStack* s);

int main(void)
{

    SeqStack s;
    init(&s);
    push(&s, 1);
    push(&s, 2);
    push(&s, 3);
    printf("%d\n", length(&s));

    if(isEmpty(&s)){
        printf("栈为空\n");
    }else{
        printf("栈不为空\n");
    }

    printf("%d\n", pop(&s));
    printf("%d\n", pop(&s));
    printf("%d\n", pop(&s));

    if(isEmpty(&s)){
        printf("栈为空\n");
    }else{
        printf("栈不为空\n");
    }

    push(&s, 3);
    clear(&s);
    if(isEmpty(&s)){
        printf("栈为空\n");
    }else{
        printf("栈不为空\n");
    }    

    return 0;
}

void init(SeqStack* s)
{
    s->top = -1;     //数组下标从0开始,因而这里表示栈为空
}

bool isEmpty(SeqStack* s)
{
    if(s->top==-1){
        return true;
    }else{
        return false;
    }
}

void push(SeqStack* s, int x)
{
    if(s->top<MaxSize-1)   //栈未满才能进栈
      s->data[++(s->top)] = x;
}

int  pop(SeqStack* s)
{
    if(s->top>-1)   //栈不为空才能出栈
      return (s->data[s->top--]);   

}

void clear(SeqStack* s)
{
    s->top = -1;
}

int length(SeqStack* s)
{
    return (s->top+1);
}

时间: 2024-12-15 07:12:55

栈的简单实现(1)-数组实现的相关文章

C#栈的简单介绍

概 栈(Stack)代表了一个只有一个出口的后进先出的对象集合.在列表中添加一项,称为推入元素,从列表中移除一项时,称为弹出元素. Stack<T> 类 public class Stack<T> : IEnumerable<T>, ICollection, IEnumerable 属性 Count 获取 Stack 中包含的元素个数 方法 Pop  移除并返回在 Stack 的顶部的对象 push 向 Stack 的顶部添加一个对象 peek 返回在 Stack 的顶

栈及其简单应用

栈是什么 栈就是一个先进先出的线性表,若能够更加方便地去理解栈,我们可以跟剧具体的图来进行理解. 相信这个图十分的生动形象,可以看出栈就像是一个桶,若每一个元素进栈的时候,便会存储在最底下,后来的会在上面:而如果需要取出元素,那么必须从最上面开始取,先放的便只能后来取,后放的便只能先取,因此栈的特点便是:先进后出,后进先出. 如何模拟并存储栈的操作 为了方便,我们需要用数组去模拟栈的序列.即: 我们定义数组和变量来表示栈,即: Stack表示栈的序列,top代表栈的元素个数,那么自然: Stac

下压栈(LIFO) (能动态调整数组大小的实现)

import java.util.*; // 下压栈(LIFO) 能动态调整数组大小的实现 public class ResizeArrayStack<Item> implements Iterable<Item> { @SuppressWarnings("unchecked") private Item[] a=(Item[]) new Object[1]; private int N; public boolean isEmpty() { return N=

顺序栈的简单操作

今天简单的实现了一下顺序栈,栈的核心函数是push(),top(),pop().首先是我自己编写的栈,后面是STL标准库调用栈函数. sqstack.h //栈的简单实现lifo #ifndef SQSTACK_H_ #define SQSTACK_H_ const int DEFAULT_SIZE=10; #include <iostream> using std::cout; using std::endl; template <typename T> class Sqstac

C++中 栈的简单封装

/*******************  *      Stack    *  * *****************/ #include <iostream> using namespace std; /***************************定义***************************************/ class Stack {     public: Stack(int capacity = 5); virtual ~Stack(); bool p

链表栈的简单实现

今天实现了链表栈的简单实现,贴出来以后可以看一看.链表栈就是用链表来实现栈的一些操作. LinkStack.h #ifndef LINKSTACK_H_ #define LINKSTACK_H_ #include <iostream> using std::cout; using std::endl; using std::ostream; template <typename T> struct Node { T data; Node<T> *next; Node()

【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改

题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i个元素的值.接下来q行,每行包含两个整数l和r,代表一次询问. 输出 对于每次询问,输出一行,代表询问的答案. 样例输入 5 5 5 2 4 1 3 1 5 1 3 2 4 3 5 2 5 样例输出 28 17 11 11 17 题解 单调栈+离线+扫描线+树状数组区间修改 首先把使用单调栈找出每个

C语言/C++编程学习:栈的代码实现之数组方案

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制). C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制. 所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样.之所以说C++比C更先进,是因为" 设计这个概念已经被融入到C++之中

数据结构之栈的简单应用(判断字符串中括号的合法性)

数据结构之栈(判断字符串中括号的合法性) 栈的定义 栈是一种线性数据结构,栈的特征是数据的插入和删除只能通过一端来实现,这一端称为"栈顶",相应的另一端称为"栈底":另外其还有先进后出,后进先出的特征. 栈是一种高效的数据结构,因为数据只能在栈的顶端添加或者删除,所以这样的操作很快而且容易实现. 说到线性结构,得先了解一下数据的逻辑结构,数据的逻辑结构分为线性结构.集合结构.树形结构和图形结构,如下图所示,栈是一种特殊的线性表,是线性结构的一种. JavaScrip