线性表之栈

栈的定义:

  一种只能在一端进行插入或删除操作的线性表被称为栈,其中允许删除或插入的一端为栈顶,另一端为栈底,栈底固定不变;

  栈的特点:先进后出,例如弹夹,先装的子弹最后才能出;

  按照存储结构可以分为两种栈:

  • 顺序栈
  • 链式栈

栈的结构体定义:

顺序栈:

  

//顺序栈的结构体定义
typedef struct {
    int data[MaxSize];
    //栈顶指针
    int top;
}SqStack;

链式栈:

//链栈结构体定义
typedef struct LNode {
    int data;
    struct LNode* next;
}LNode;

  ps:有没有发现链式栈和单链表定义一模一样;其实栈的本质就是受约束的线性表;

基本算法:

判断栈是否为空:

bool IsEmptyS(SqStack s) {
    if (s.top == -1)
        return true;
    else
        return false;
}

栈是否为为满:

bool IsFullS(SqStack s) {
    if (s.top == MaxSize - 1)
        return true;
    else
        return false;
}

栈的初始化:

void InitialStack(SqStack &s) {
    //规定top=-1时为空栈
    s.top = -1;
}

入栈:

bool push(SqStack &s, int x) {
    if (s.top == MaxSize - 1)
        return false;
    s.data[++s.top] = x;
    return true;
}

出栈:

int pop(SqStack &s) {
    if (s.top == -1)
        return false;
    return s.data[s.top--];

}

打印整个栈:

void PrintStack(SqStack s) {
    if (s.top == -1) {
        cout << "栈空,无法打印" << endl;
    }
    int i = s.top;
    for (i; i >= 0; i--) {
        cout << s.data[s.top--]<<"\t";
    }

    cout << endl;
}

测试用例:

int main()
{

    int a[4] = { 1,2,3,4 };
    SqStack s;
    InitialStack(s);
    cout << "顺序栈测试" << endl;

    for (int i = 0; i < 4; i++) {
        push(s, a[i]);
    }
    PrintStack(s);

    cout << "2入栈" << endl;
    push(s, 2);
    cout << "10入栈" << endl;
    push(s, 10);
    PrintStack(s);
    cout << "出栈第一次\t" << pop(s) << endl;
    cout << "出栈第二次\t" << pop(s) << endl;
    cout << "出栈第三次\t" << pop(s) << endl;

    PrintStack(s);

    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/zuixime0515/p/9613922.html

时间: 2024-11-25 19:38:27

线性表之栈的相关文章

[考研系列之数据结构]线性表之栈

?基本概念 栈的定义 限定仅在表尾进行插入或删除的线性表 组成 栈顶 栈底 基本操作 入栈(PUSH) 往栈中插入一个元素 弹栈(POP) 从栈顶删除一个元素 栈的表示 顺序栈 链栈 对于顺序栈,有两个指针base和top base指向栈底 top指向栈顶 对于栈的一些基本情况: 栈不存在时候 base=NULL 栈为空时  top=base 栈的长度 top-base 链栈略过. 栈的应用 1 数制转换 数制转换我们使用一种称之为"辗转相除法"的算法.此算法的基本原理基于: N=(N

数据结构回顾之顺序存储结构中的线性表(栈与队列顺序线性表实现)

说到数据结构呢,对于一个Coder来说还是蛮重要的啦,每次看数据结构的东西都有新的收获,这两天在回顾数据结构的知识.当然啦,虽然数据结构有些是理论的东西,如果好好的理解数据结构的东西还是少不了的代码的支撑的.数据结构简单的来说吧,可以分为两大类,一个是数据的"物理存储结构",另一种是数据的"逻辑存储结构".数据的"物理存储结构"又可分为顺序的和链式的(下面将会结合着代码打印内存地址的形式来观察物理存储结构). 逻辑存储结构又可分为集合,线性, 树

&lt;2014 05 16&gt; 线性表、栈与队列——一个环形队列的C语言实现

栈与队列都是具有特殊存取方式的线性表,栈属于先进后出(FILO),而队列则是先进先出(FIFO).栈能够将递归问题转化为非递归问题,这是它的一个重要特性.除了FILO.FIFO这样的最普遍存取方式外,还有一些扩展的数据结构,如双端队列.双栈.超队列.超栈等,它们是一种扩展与变异结构. 线性表有顺序存储和链接存储两类,这是针对计算机的线性存储空间作出的分类.前者可以是数组,后者可以是链表.字符串是线性表最常见的应用. 这里我用C语言实现了一个基于数组环形队列,它具有固定的队列空间.相比于链表实现,

Learning Data Structure_2_线性表、栈和队列

一个人在学校的日子有些寂寞,但是st说男人要耐得住寂寞,做学问也是如此吧.今天看了线性表.栈和队列的内容.以下是学习记录. 线性表(list) 1.定义:0个或多个数据元素的有限序列,元素有且只有一个直接后继和一个直接前驱:基本操作ListLength.GetElem.LocateElem.ListInsert等,并集Union的实现. 2.线性表的顺序存储结构 指用一段地址连续的存储单元依次存储数据元素(c语言中用数组实现改结构):数组长度>=线性表的长度:对于任意位置的存入或取出的所需时间相

【Java】 大话数据结构(6) 线性表之栈

本文根据<大话数据结构>一书,实现了Java版的栈的顺序存储结构.两栈共享空间.栈的链式存储机构. 栈:限定仅在表尾进行插入和删除操作的线性表. 栈的插入(进栈)和删除(出栈)操作如下图所示.   1.栈的顺序存储结构 用数组存放数据,top变量来指示栈顶元素在数组中的位置(栈顶指针).一个长度为5的栈的示意图如下: 实现程序: /** * 栈的顺序储存结构 * * 问题:构造器中,泛型数组创建是否有更好的方法? * @author Yongh * */ public class SqStac

数据结构代码整理(线性表,栈,串,二叉树)。。持续更新中。。。

//线性表 #include <cstdio> #include <cstring> #include <iostream> #include <cstdlib> using namespace std; ///都用c语言写的 ///建议从主函数开始看 int sequence_map[100005]; ///顺序表的数组 int total_sequence=0,total_list=0; ///定义两个全局变量用来计算顺序表与链表长度,初始值为0 str

线性表之栈与队列

一.栈是限定仅在表尾进行插入和删除操作的线性表 队列是只允许在一端进行插入操作,而在另另一端进行删除操作的线性表. 允许插入和删除的一端称为栈顶,另一端称为栈底,不包含任何数据元素的栈称为空栈,栈称为后进先出  LIFO结构 栈的抽象数据类型 ADT 栈 (stack) Data 同线性表.元素具有相同的类型,相邻元素具有前驱和后继关系 Operation InitStack(*S):初始化操作,建立一个空栈S DestroyStack(*S):若栈存在,则销毁它 ClearStack(*S):

数据结构和算法 (二)数据结构基础、线性表、栈和队列、数组和字符串

Java面试宝典之数据结构基础 —— 线性表篇 一.数据结构概念 用我的理解,数据结构包含数据和结构,通俗一点就是将数据按照一定的结构组合起来,不同的组合方式会有不同的效率,使用不同的场景,如此而已.比 如我们最常用的数组,就是一种数据结构,有独特的承载数据的方式,按顺序排列,其特点就是你可以根据下标快速查找元素,但是因为在数组中插入和删除元素会 有其它元素较大幅度的便宜,所以会带来较多的消耗,所以因为这种特点,使得数组适合:查询比较频繁,增.删比较少的情况,这就是数据结构的概念.数据结构 包括

Java数据结构-线性表之栈(顺序栈和链栈)

栈的定义:(特殊的线性表) ??仅在表的一端进行插入和删除的线性表.允许插入.删除的这一端称为栈顶,另一端称为栈底.表中没有元素时称为空栈. ??被称为后进先出的线性表(Last In First Out),简称 LIFO表,或被称为先进后出的线性表(First In Last Out),简称 FILO表. ??栈更具存储方式的不同分为两种:顺序栈和链栈. 顺序栈: 和顺序表一样,顺序栈也采用数组来存放数据元素: 为了保证栈底位置的不变,采用数组下标为0的位置作为顺序栈的栈底. 而栈顶指针的最大

数据结构学习笔记(特殊的线性表:栈与队列)

栈与队列 栈是限定仅在表尾(栈顶)进行插入和删除操作的线性表(后进先出).队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表(先进先出). 栈(Stack): 1.下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作为栈底.定义一个top变量来指示栈顶元素在数组中的位置.栈顶位置top必须小于存储栈长度StackSize,把空栈的判定条件定位top等于-1. 2.进栈与出栈操作(顺序存储结构): 进栈操作push:/*插入元素e为新的栈顶元素*/Status Pu