天勤考研数据结构笔记--栈的C语言实现

1、栈的基本概念

  • 栈的定义:栈是一种只能在一端进行插入或删除操作的线性表。其中允许进行插入或删除的一端称为栈顶(top)。栈顶是由一个称为栈顶指针的位置指示器(其实就是一个变量,对于顺序栈,就是数组索引,对于链式栈,就是节点地址的指针)来指示。栈的插入和删除操作一般称为入栈和出栈。
  • 栈的特点:先进后出(FILO)。

2、栈的本质

栈依照存储结构可分为顺序栈和链式栈。由栈的定义可知,栈是一种在操作上稍加限制的线性表,即栈的本质是线性表,而线性表恰好有两种主要的存储结构——顺序表和链表。

3、顺序栈的实现

#define MaxSize = 100;

/*顺序栈的定义*/
typedef struct
{
    int data[MaxSize];
    int top;
}Stack;

/*初始化*/
void initStack(Stack &st)
{
    st.top = -1;
}

/*判断栈是否为空*/
bool isEmpty(Stack st)
{
    return st.top == -1 ? true : false;
}

/*进栈,返回:成功true,失败false*/
bool push(Stack &st, int x)
{
    if(st.top == MaxSize-1)
        return false;
    st.data[++st.top] = x;
    return true;
}

/*出栈,返回:成功true,失败false*/
bool pop(Stack &st, int &x)
{
    if(st.top == -1)
        return false;
    x = st.data[st.top--];
    return true;
}

说明:在考试中,栈常常作为一个工具来解决其他问题,因此一般情况下,栈的定义以及操作可以写得很简单,不必调用以上函数。上述函数只作为标准操作来参考,使用价值并不高。在考题中比较实用的栈操作写法如下:

  • 定义一个栈并初始化(假设元素是int型)

    /*两句话连定义和初始化都有了*/
    int stack[MaxSize];
    int top = -1;
  • 元素x进栈
    stack[++top] = x;
  • 元素x出栈

    x = stack[top--];

4、链栈的实现

/*链栈的定义*/
typedef struct
{
    int data;
    Stack *next;
}Stack;

/*链栈的初始化*/
void initStack(Stack *&st)
{
    st = (Stack*)malloc(sizeof(Stack)); //制造一个头结点
    st->next = NULL;
}

/*判断是否为空*/
bool isEmpty(Stack *st)
{
    return st->next == NULL ? true : false;
}

/*进栈代码*/
void push(Stack *st, int x)
{
    Stack *p = (Stack*)malloc(sizeof(Stack));
    p->data = x;
    /*以下头插法进栈*/
    p->next = st->next;
    st->next = p;
}

/*出栈,返回:成功true,失败false*/
bool pop(Stack *st, int &x)
{
    if(st->next == NULL)
        return false;
    Stack *p = st->next;
    x = p->data;
    /*以下是单链表删除操作*/
    st->next = p->next;
    free(p);
    return true;
}

说明:对于链栈,和顺序栈一样,在应对考试的时候,不必像以上那样严格地写出其操作的函数,只需摘取其中必要的语句组合在自己的题目代码中即可,类似思路类似顺序栈的讲解。特别注意,在考研中考察链栈的频率要比顺序栈的频率少得多,因为顺序栈定义和操作都简单得多。因此,对程序设计题,七分精力放在顺序栈中。

后续补上顺序栈的应用

原文地址:https://www.cnblogs.com/evenleee/p/8506841.html

时间: 2024-11-08 13:23:00

天勤考研数据结构笔记--栈的C语言实现的相关文章

数据结构笔记#栈

可以说线性表的一个具体应用就是栈,可能看完以下代码你觉得这是什么嘛有什么卵用啊,但是栈在现实生活的中的应用,或者说这种概念的应用是非常广泛的. 比如说各种浏览器的返回上一级功能. 栈与线性表最大的差别就是它对数据的操控是受限的,遵守Last in First out(LIFO)“后进先出原则”的数据结构都可以叫栈. 栈一般长这个样子(美工欠下了3.5个亿带着他的小姨子跑了!) 右边是我们对线性表之单链表的正常理解,数据从表头到表尾依次排放. 左边是栈的特性,处于上层的元素(较新)叫top,处于底

数据结构笔记——栈

栈的应用及构造 栈的简介 栈是一种只能从一端进行删除和插入的线性结构.因此栈具有后进先出的特点.例如进栈顺序是12345,如果5是第一个出栈的数字,则接下来出栈的一定是4,3,2,1.由于栈后进先出的特点,所以栈经常被递归算法调用,此时栈被称为递归工作栈.从栈的容量来看,栈可被分为动态栈可静态栈.动态栈顾名思义即使栈的容量可变,静态栈即是栈的容量是固定的. 用顺序表构造的静态栈及其操作 1.栈的构造:申请给定大小空间,将栈顶指针指向栈底. 2.栈的初始化:将栈的栈顶指针指向栈底. 3.栈的插入:

链栈的c语言实现

1.链栈结构 typedef struct StackNode { SElemType data; struct StackNode *next; }StackNode,*LinkStackPtr; typedef struct { LinkStackPtr top; int count; }LinkStack; 2.构造一个空栈S Status InitStack(LinkStack *S) { S->top = (LinkStackPtr)malloc(sizeof(StackNode));

数据结构笔记之——括号匹配(栈的应用之一)(SDOJ 2134)

//  度过了上周的悲催状态,我决定好好学习了-- //书上括号匹配是栈的简单应用,正好在SDOJ上看到这道题,顺便做了下 题目地址:SDOJ 2134 数据结构实验之栈四:括号匹配 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入 输入数据有多组,处理到文件结束. 输出 如果匹配就输出

15、蛤蟆的数据结构笔记之十五栈的应用之栈与递归之八皇后问题

15.蛤蟆的数据结构笔记之十五栈的应用之栈与递归之八皇后问题 本篇名言:"人的一生应当这样度过:当回忆往事的时候,他不致于因为虚度年华而痛悔,也不致于因为过去的碌碌无为而羞愧:在临死的时候,他能够说:"我的整个生命和全部精力,都已经献给世界上最壮丽的事业--为人类的解放而斗争." 继续递归问题,本次是经典的八皇后问题: 欢迎转载,转载请标明出处: 1.  八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出

14、蛤蟆的数据结构笔记之十四栈的应用之栈与递归之阿克曼函数

14.蛤蟆的数据结构笔记之十四栈的应用之栈与递归之阿克曼函数 本篇名言:"今天就是生命 ----- 是唯一你能确知的生命." 继续递归应用,阿克曼函数. 欢迎转载,转载请标明出处: 1.  阿克曼函数 阿克曼函数(Ackermann)是非原始递归函数的例子.它需要两个自然数作为输入值,输出一个自然数.它的输出值增长速度非常高,仅是对于(4,3)的输出已大得不能准确计算. Ackermann函数定义如下: 若m=0,返回n+1. 若m>0且n=0,返回Ackermann(m-1,1

13、蛤蟆的数据结构笔记之十三栈的应用之栈与递归之斐波那契数列

13.蛤蟆的数据结构笔记之十三栈的应用之栈与递归之斐波那契数列 本篇名言:"人生不是一支短短的蜡烛,而是一支由我们暂时拿着的火炬,我们一定要把它燃得." 继续递归的斐波那契数列问题. 欢迎转载,转载请标明出处: 1.  斐波那契数列 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理.准晶体结构.化学

7、蛤蟆的数据结构笔记之七栈的应用之数制转换

7.蛤蟆的数据结构笔记之七栈的应用之数制转换 本篇名言:"人生意义的大小,不在乎外界的变迁,而在乎内心的经验." 上面两篇中我们实现了链栈和链队列,接下去哦我们看看实际中栈的应用场景.本次来看下栈在数制转换的作用. 欢迎转载,转载请标明出处: 1.  原理介绍 十进制N和其他进制数的转换时计算机实现计算的基本问题.简单算法如下: N=(N div d )x d + N modd 2.  实现 2.1         定义结构体 定义堆栈的结构体 typedef struct { int

16、蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题

16.蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题 本篇名言:"人生的价值,并不是用时间,而是用深度去衡量的." 继续栈与递归应用,汉诺塔问题. 欢迎转载,转载请标明出处: 1.  汉诺塔问题 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一