数据结构导论(第三章栈)

一、栈

栈和队列可看作是特 殊的线性表,它们是 运算受限的线性表

定义:栈是只能在表的一端(表尾)进行 插入和删除的线性表

  • 允许插入及删除的一端(表尾)称为栈顶(Top); .
  • 另一端(表头)称为栈底(Bottom)。 .
  • 当表中没有元素时称为空栈
  • 进栈——在栈顶插入一元素;
  • 出栈——在栈顶删除一元素

特点:后进先出

  栈中元素按a1,a2,a3,…an的次序进栈,出栈的第一个元素应 为栈顶元素。换句话说,栈的修改是按后进先出的原则进行的。 因此,栈称为后进先出线性表(LIFO)。

栈的用途:常用于暂时保存有待处理的数据

栈的基本操作

  • (1)初始化栈:InitStack(S);
  • (2)判栈空:EmptyStack (S);
  • (3)进栈:Push (S,x);
  • (4)出栈:Pop (S);
  • (5)取栈顶: GetTop(S);

栈的分类:按照顺序结构存储是顺序栈、按照链式结果存储是链栈

二、顺序栈

顺序栈—— 即栈的顺序实现;

栈容量——栈中可存放的最大元素个数;

栈顶指针 top——指示当前栈顶元素在栈中的位置;

栈空——栈中无元素时,表示栈空;

栈满——数组空间已被占满时,称栈满;

下溢——当栈空时,再要求作出栈运算,则称“下溢”;

上溢——当栈满时,再要求作进栈运算,则称“上溢”。

1、顺序栈的类型定义

const int maxsize=6;
typedef struct seqstack {
  DataType data[maxsize];
  int top;
}SeqStk;

SeqStk *s ; 定义一顺序栈s
约定栈的第1个元素存在data[1]中,则
s->top==0 代表顺序栈s为空;
s->top==maxsize-1 代表顺序栈s为满

2、初始化:

int Initstack(SeqStk *stk){
    stk->top=0;
    return 1;
}

3、判栈空(栈空时返回值为1,否则返回值为0)

int EmptyStack(SeqStk *stk){
    if(stk->top= =0) return 1;
    else return 0;
}

4、进栈

int Push(SeqStk *stk, DataType x){
    /*数据元素x进顺序栈sq*/
    if(stk->top==maxsize -1) /*判是否上溢*/
    { error(“栈满”);return 0;} /*上溢*/
    else {
        stk->top++;/*修改栈顶指针,指向新栈顶*/
        stk->data[stk->top]=x; /*元素x插入新栈顶中*/
        return 1;
    }
    }
}

5、出栈

int Pop(SeqStk *stk){
    /*顺序栈sq的栈顶元素退栈*/
    if(stk->top==0) /*判是否下溢*/
    { error(“栈空”);return 0;} /*下溢*/
    else {
    stk->top-- ; /*修改栈顶指针,指向新栈顶*/
    return 1;
    }
}/*Pop*/

6、取栈顶元素

DataType GetTop(SeqStk *stk)
{
if(EmptyStack(stk))
return NULLData;
else
return stk->data[stk->top];
}

三、链栈

链栈的定义: 栈的链式存储结构称为链栈,它是运算受限的单链表, 插入和删除操作仅限制在表头位置上进行。栈顶指针就是链 表的头指针

1、初始化

void InitStack(LkStk *LS)
{
  LS=(LkStk *)malloc(sizeof(LkStk));
  LS->next=NULL;
}

2、判栈空

int EmptyStack(LkStk *LS)
{
    if(LS->next= =NULL) return 1;
    else return 0;
}

3、进栈——在栈顶插入一元素x

void Push (LkStk *LS, DataType x){
    LkStk *temp;
    temp= (LkStk *) malloc (sizeof (LkStk));
    temp->data=x;
    temp->next=LS->next;
    LS->next=temp;
}

4、出栈——在栈顶删除一元素,并返回

int Pop (LkStk *LS)
{
    LkStk *temp;
    if (!EmptyStack (LS))
    {
        temp=LS->next;
        LS->next=temp->next;
        free(temp);
        return 1;
    }
    else return 0;
}

5、取栈顶元素

DataType GetTop(LkStk *LS)
{
    if (!EmptyStack(LS))
    return LS->next->data;
    else
    return NULLData;
}
(0)

相关推荐

  • C语言数据结构和算法快速排序法

    https://m.toutiao.com/is/JHSWhce/ 一.设计思想 对一组无序的数组进行排序的时候,选其中一个数组元素(一般为中间元素)作为参照,把比它小的元素放到它的左边,比它大的元素 ...

  • 新世纪研究生教学用书:方法论导论 第三章

    第三章 中庸.无为.中道 第一节 儒家的中庸之道 第二节 道家的无为 第三节 佛家的中道观

  • 第三届中华长江文学奖2021年度诗人奖初选:高鑫散文诗三章

    散文诗   秋 夜     高鑫     今夜,秋风正凉,夜色渐深,独坐窗前,茗香清润.多想有一次心灵的渴望,如骤雨狂风般燥动我的心声--   远逝的時光,那些特定的岁月,多少次让我与美丽的荣华擦肩而 ...

  • 2021年度“叶芝国际诗歌奖”初选:包玉平《吊桥记》三章

    吊桥记(三章) 文/包玉平   1. 这一截遇见流水而蓦然惊惶并战栗摇晃的路径,在你脚下竭力制造 极短吸食小剂量麦司卡林的轻微感觉和 人生的陡坡,以及其它不曾想象的,诸多不稳定因素.   倾斜的事物, ...

  • 第三章 常用对药 经验方录  何复东五十年临证高效验方

    第三章 常用对药 1桑叶.菊花[功效主治]疏风清热,平肝明目.用于风热感冒,肺热燥咳,头晕头痛,目赤昏花等症.凡病在上焦.头目,与风热.肝胆热相关的病证均可使用. 两药相合,疏风清热.平肝明目之效尤著 ...

  • 『糖尿病饮食与防治』第三章 糖尿病急性并发症与预防

    第三章  糖尿病急性并发症与预防 一.糖尿病非酮症高渗综合征 60岁以上的Ⅱ型糖尿病患者或发病前无任何症状或仅有轻度症状者,多易发糖尿病非酮症高渗综合征.临床上常见严重脱水.高血糖(>33畅3毫 ...

  • 『中医偏方精品』第三章 消化系统疾病

    一.消化不良 消化是人体的重要功能之一.通过消化功能,使摄入的食物经过一系列复杂的同化过程,分解成可溶性的.不具有特异性的小分子营养物质如氨基酸.葡萄糖等,被肠道吸收,变成体内的物质,供全身组织利用. ...

  • 散文诗:五月,做一朵自由行走的花(三章)

    五月,渐入佳境. 五月的篱墙上,光影叠翠,鸟鸣日暄.季节,像一朵自由行走的花,浓淡着一路心情. 阳光穿窗越户,也明亮,也温柔,大地披上盛装,意趣盎然. 想去心中的远方走走. 或者,就坐在光阴里,和光阴 ...

  • 散文诗:初夏(三章)

    --过了立夏,季节的窗棂垂下夏天的画卷,初夏,夏天正当好的时段,晴日暖风生麦气,绿荫幽草胜花时.             --题记 过了立夏,风一日日暖了. 站在窗前,看树木摇着叶子起舞,鸟儿叽叽喳喳 ...

  • 耶鲁故事:“秋心”三章 | 苏炜

    耶鲁校园一景 01 秋心再题 大约十多年前,我曾写过短文<秋心>,记写我教过的一位耶鲁华裔学生,在毕业离校五年后的中秋节当日,专门登门拜访并赠送一盒月饼的感人小故事.当时我在文后附了一首记 ...