数据结构复习_栈和队列,应用_括号匹配&文件目录递归拷贝,

1、主题

2、学习视频和资料

视频    http://study.163.com/course/courseLearn.htm?courseId=555010#/learn/video?lessonId=701019&courseId=555010

http://study.163.com/course/courseLearn.htm?courseId=555010#/learn/video?lessonId=702024&courseId=555010

3、实现

数组或列表实现

4、应用

编程中的括号匹配、四则运算

队列

交互式程序中生产消费队列

5、知识体系

栈的基本操作

  1. 定义栈的元素
  2. 建立栈的信息:栈底、大小、栈顶标记
  3. 初始化栈的操作
  4. 销毁栈的操作
  5. 入栈操作(包括溢出判断,开辟新空间)
  6. 获取栈顶指针操作(出栈)
  7. 获取栈顶信息操作(出栈)
  8. 栈为空判断

用栈来检测表达式中的括号是否匹配

问题:(1)栈什么时候为空?标记法

a、栈底存储特殊标记

b、记录栈底的位置

(2)栈溢出怎么办?

a、开辟固定空间,设置一个计数值,如果达到上限,就申请新空间。

b、链式的,入一个就开辟一个空间。(效率低)

更多的时候使用栈时是连续的空间,而不是链式。

场景分析:

6、程序框架

typedef struct _member
{
    char ch;//单元内容
    int line;//行号
    int column;//列号
}node,*pnode;

typedef struct _stack_ds //记录栈的信息
{
    int size;//size of stack
    int memb;//number of members
    node ptr[0];//stack location 存放数据的位置
}stack_ds,*pstack_ds;

pstack_ds init_stack(int size)
{
    pstack_ds head = (pstack_ds)malloc(sizeof(stack_ds) + sizeof(node)*size);
    head->size = size;
    head->memb = 0;
    memset(head->ptr,'\0',sizeof(node)*size);

    return head;
}

void destroy_stack(pstack_ds head)
{
    free(head); //一次申请一次释放
}

void push_stack(pstack_ds head,char ch,int line,int column)
{
    if (head->memb == head->size)
    {
        //realloc stack memory, to do
    }
    head->ptr[head->memb].ch = ch;
    head->ptr[head->memb].line = line;
    head->ptr[head->memb].column = column;

    head->memb++;
}

pnode pop_stack(pstack_ds head)
{
    if(head->memb == 0)
        return null;
    else
    {
        head->memb--;
        return head.ptr + head->memb;
    }
}

char fetch_top_memb(pstack_ds head)
{
    if(head->memb == 0)
        return -1;
    else
        return head->ptr[head->memb - 1].ch;
}

/*判断栈是否空*/
int empty_stack(pstack_ds head)
{
    if (head->member <= 0)
    {
        return 1;
    }
    else
        return 0;
}

int main(int argc,char *argv[])
{
    if(argc < 2)
    {
        printf("pls usage %s filename\n",argv[0] );
        exit(EXIT_FAILURE);
    }
    FILE *fp = fopen(argv[1],"r");
    if (fp == NULL)
    {
        perror("fopen");
        exit(EXIT_FAILURE);
    }

    fclose(fp);
}

补充

void *memset(void *s, int ch, size_t n) 函数

资料:http://baike.baidu.com/link?url=iJtPH2Y5qaWD9DpIkIoNEwIsLpEV88fE3WmciPLuACVCLfcbaOeb6MPcfyVyWeAKu1L7OtGyHwZEncV077jBKa

语句:memset(head->ptr,‘\0‘,sizeof(node)*size);

操作对象:连续内存块

函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。

作用:在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。

7、后记

有问题可邮件[email protected],欢迎讨论!

时间: 2024-12-19 23:24:35

数据结构复习_栈和队列,应用_括号匹配&文件目录递归拷贝,的相关文章

数据结构复习之栈和队列

栈的概念 栈(stack)是限定只能在表尾进行插入和删除操作的线性表. 栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构. 允许插入和删除的一段称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈. 栈的插入操作,叫做进栈,也称压栈.入栈.(push) 栈的删除操作,叫做出栈,也有叫做弹栈.(pop) 栈的存储方式 栈的顺序存储结构 栈的链式存储结构 两种方式的比较: 时间性能:两种存储方式的入栈和出栈的时间复杂度都为O(1). 空间性

数据结构与算法--栈、队列(队列)

Hello,everybody.我们又见面了.今天我们来学习一下队列这个数据结构,let's Go,开始我们的征程吧. 首先,举两个生活中的常见例子.相信大家,在用电脑工作娱乐时,都会碰到这样的现象.当我们点击程序或进行其他操作时,电脑处于死机状态.正当我们准备Reset时,它突然像打了鸡血似的,突然把刚才我们的操作,按顺序执行了一遍.之所以会出现这个现象,是因为操作系统的多个程序,需要通过一个管道输出,而按先后顺序排队造成的. 还有有个例子,在我们打客服热线时,有时会出现等待的现象.当其他客户

4、蛤蟆的数据结构笔记之四栈和队列定义

4.蛤蟆的数据结构笔记之四栈和队列定义 本篇名言:"人生应该如蜡烛一样,从顶燃到底,一直都是光明的." 今天学习栈和队列了.从第二篇学习时候我们知道,其实也是线性表的一种. 我们先来看下定义. 欢迎转载,转载请标明出处: 1.  栈 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称

SDUT 2449 数据结构实验之栈与队列十:走迷宫

数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数. Input 第一行一个整数T 表示有T 组测试数据.(T <= 110) 对于每组测试数据: 第一行两个整数n, m,表示迷宫有n * m 个格子.(1

SDUT-3335_数据结构实验之栈与队列八:栈的基本操作

数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 堆栈是一种基本的数据结构.堆栈具有两种基本操作方式,push 和 pop.push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出.现在我们就来验证一下堆栈的使用. Input 首先输入整数t(1 <= t <= 10),代表测试的组数,以后是 t 组输入. 对于每组测试数据,第一行输入两个正整数 m(1 <= m &

SDUT-2088_数据结构实验之栈与队列十一:refresh的停车场

数据结构实验之栈与队列十一:refresh的停车场 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description refresh最近发了一笔横财,开了一家停车场.由于土地有限,停车场内停车数量有限,但是要求进停车场的车辆过多.当停车场满时,要进入的车辆会进入便道等待,最先进入便道的车辆会优先 进入停车场,而且停车场的结构要求只出去的车辆必须是停车场中最后进去的车辆.现告诉你停车场容量N以及命令数M,以及一些命令(Add num 表

SDUT-2449_数据结构实验之栈与队列十:走迷宫

数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数. Input 第一行一个整数T 表示有T 组测试数据.(T <= 110) 对于每组测试数据: 第一行两个整数n, m,表示迷宫有n * m 个格子.(1

数据结构算法(1)--栈与队列

数据结构算法(1)--栈与队列 总结并记录学习数据结构过程中遇到的问题及算法. 一些常见算法: Note: 基础应用. 递归的非递归转化. 阶乘 递归实现: #include <iostream> using namespace std; int F(int n) { if (n == 0 || n == 1) return 1; else return n * F(n - 1); } int main() { int s; cin >> s; int result = F(s);

数据结构实验之栈与队列九:行编辑器

数据结构实验之栈与队列九:行编辑器 Description 一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区. 由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,“每接受一个字符即存入用户数据区”的做法显然不是最恰当的.较好的做法是,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区.允许用户输入出差错,并在发现有误时可以及时更正.例如,当用户发现刚刚键入的一个字符是错的时,可补进一个退格符"#",以表示前一个字符无