精华内容
下载资源
问答
  • 2.5 怎样表示一个算法 为了表示一个算法,可以用不同方法。常用方法由:自然语言、传统流程图、结构化流程图和伪代码等。 2.5.1 用自然语言表示算法 自然语言就是人们日常使用语言,可以是汉语、英语或其他...

    2.5 怎样表示一个算法

    为了表示一个算法,可以用不同的方法。常用的方法由:自然语言、传统流程图、结构化流程图和伪代码等。

    2.5.1 用自然语言表示算法

    • 自然语言就是人们日常使用的语言,可以是汉语、英语或其他语言。
    • 用自然语言表示通俗易懂,但文字冗长,容易出现歧义。自然语言表示的含义往往不大严格,要根据上下文才能判断其正确含义。
    • 用自然语言来描述包含分支和循环的算法不大方便。因此,除了那些很简单的问题以外,一般不用自然语言表示算法。

    2.5.2 用流程图表示算法

    • 流程图是用一些图框来表示各种操作。用图形表示算法,直观形象,易于理解。
      在这里插入图片描述

    2.5.3 三种基本结构和改进的流程图

    1.传统流程图的弊端

    传统的流程图用流程线指出各框的执行顺序,对流程线的使用没有严格限制。因此,使用者可以不受限制地使流程随意地转来转去,使流程图变得毫无规律,阅读时要花很大精力去追踪流程,使人难以理解算法的逻辑。

    2.三种基本结构
    在这里插入图片描述
    以上 3 种基本结构,有以下共同特点:

    1. 只有一个入口。
    2. 只有一个出口。
    3. 结构内的每一部分都有机会被执行到。
    4. 结构内不存在 “死循环”。

    2.5.4 用 N-S 流程图表示算法

    在这里插入图片描述

    2.5.5 用伪代码表示算法

    • 伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。
    • 它如同一篇文章一样,自上而下地写下来。每一行(或几行)表示一个基本操作。
    • 它不用图形符号,因此书写方便,格式紧凑,修改方便,容易看懂,也便于向计算机语言算法(即程序)过渡。

    2.5.6 用计算机语言表示算法

    • 要完成一项工作,包括设计算法和实现算法两个部分。设计算法的目的是为了实现算法。因此,不仅要考虑如何设计一个算法,也要考虑如何实现一个算法。
    • 我们考虑的是用计算机解题,也就是要用计算机实现算法,而计算机是无法识别流程图和伪代码的,只有用计算机语言编写的程序才能被计算机执行,因此在用流程图或伪代码描述一个算法后,还要将它转换成计算机语言程序。
    • 用计算机语言表示的算法是计算机能够执行的算法。用计算机语言表示算法必须严格遵循所用的语言的语法规则,这是和伪代码不同的。

    2.6 结构化程序设计方法

    结构化程序设计方法的基本思路是:把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。

    采取以下方法来保证得到结构化的程序:

    1. 自顶向下
    2. 逐步细化
    3. 模块化设计
    4. 结构化编码

    在这里插入图片描述

    展开全文
  • 点击上方蓝,关注:无量测试之道 作者 |无量测试之道 编辑 |小晴有效括号,刷过LeetCode也许对这道题很熟悉。1.开篇问题:有效括号[1]假如...关于栈,有一个非常贴切游戏--汉诺塔。玩这个游戏时候,我们都...

        点击上方蓝字,关注:无量测试之道

    019bd16e374714d253f3e944c41bff78.png

       作者 | 无量测试之道   编辑 | 小 晴有效括号,刷过LeetCode的也许对这道题很熟悉。

    1.开篇问题:有效的括号[1]

    6e24e5a23c033dbb6e1a42f00209ec48.png

    假如现在要你来解这道题,你会想到怎样的解法了?

    这就要用到我们今天要讲的“栈”这种数据结构。带着这个问题,我们来学习今天的内容。

    2.如何理解“栈”?

        关于栈,有一个非常贴切的游戏--汉诺塔。玩这个游戏的时候,我们都是从下往上一个一个放;取的时候,我们也是从上往下一个一个地依次取,不能从中间任意抽出。后进者先出,先进者后出,这就是典型的“栈”结构1360252ce40ac9ffc785c316ae0fcab5.png从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。栈的定义[2]    栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

    3.如何实现栈

        从刚才栈的定义里,我们可以看出,栈主要包含两个操作,入栈和出栈,也就是在栈顶插入一个数据和从栈顶删除一个数据。理解了栈的定义之后,我们来看一看如何用代码实现一个栈。  【本文使用  swift语言来编写代码,读者朋友们不要因为编程语言不同而有畏难情绪,重要的是思维和逻辑,语言只是表达方式。你可以用你自己熟悉的语言来表达你的逻辑,可以先试着写一写】Talking is cheap,show you the code.
    class Stack {
    //初始化数组
    var datas = [Int]()
    //出栈操作
    func pop() -> Int? {
    return datas.popLast()
    }
    //入栈操作
    func push(obj: Int) {
    datas.append(obj)
    }
    //栈顶对象
    func top() -> Int? {
    return datas.last
    }
    }

    4.栈在实际开发过程中的应用

    • 栈在函数调用中的应用

    func calculate() {
    let a = 3
    let b = 5
    var result = 0
    result = add(x: a, y: b)
    print(result)
    }
    func add(x: Int, y: Int) -> Int {
    var sum= 0
    sum = x + y
    return sum
    }
        从代码中我们可以看出,calculate() 函数调用了 add() 函数,传入临时变量a和b,获取计算结果,最后打印 result 的值。    为了让你清晰地看到这个过程对应的函数栈里出栈、入栈的操作,我画了一张图。图中显示的是,在执行到 add() 函数时,函数调用栈的情况。ceb08d9f3f4c20a9cc7921e42bcb1f28.png
    • 递归

        在算法中,经常会使用的一个思想就是递归思想。很著名的就是斐波那契数列[3]F(0) =0,
    F(1) =1,
    F(n) = F(n-1)+F(n-2)(n≥2,n∈N*)
    计算F(n)时需要先计算F(n-1)F(n-2)
    计算
    F(n-1)时需要先计算F(n-2)F(n-3)
    计算
    F(n-2)时需要先计算F(n-2)F(n-3)···
    最后的效果是,会有很多中间值压入栈中,这也是为什么,当
    n很大的时候,会非常消耗内存。所以在实际的开发中,掌握这些底层的开发基础,会有助你选择合适的技术方案。

    5.概念区分:数据结构堆栈 VS 内存中的堆栈

        在学习计算机基础的时候,我们知道内存中有栈区和堆区。那它与数据结构中的堆栈有什么区别了,它们是同一个概念吗?    内存中的堆栈数据结构堆栈不是一个概念,可以说内存中的堆栈是真实存在的物理区,数据结构中的堆栈是抽象的数据存储结构。    内存空间在逻辑上分为三部分:代码区、静态数据区和动态数据区,动态数据区又分为栈区和堆区。    代码区:存储方法体的二进制代码。高级调度(作业调度)、中级调度(内存调度)、低级调度(进程调度)控制代码区执行代码的切换。    静态数据区:存储全局变量、静态变量、常量,常量包括final修饰的常量和String常量。系统自动分配和回收。    栈区:存储运行方法的形参、局部变量、返回值。由系统自动分配和回收。    堆区:new一个对象的引用或地址存储在栈区,指向该对象存储在堆区中的真实数据。

    6.解答开篇

        好了,我想现在你已经完全理解了栈的概念。我们再回来看看开篇的思考题,如何实现有效括号的判断?其实使用栈的思想就可以非常完美的解决这个问题。我们开始分析:
    • 1.如果开始就是右括号)、]、},很明显不合法,直接返回false
    • 2.如果是左括号 (、[、{,就压栈。如果是右括号)、]、},在stack有值的情况下与栈顶元素匹配,匹配通过则栈顶元素出栈,否则直接返回false。
    下面是swift解题的实现代码
    class Solution {
    func isValid(_ s: String) -> Bool {
    if s.count == 0 { return false }
    var stack = [String]()
    let dict: [String:String] = ["(":")","[":"]","{":"}"]
    for c in s {
    if dict.keys.contains(c.description) {
    stack.append(c.description) //如果是左括号就入栈
    }else {
    if stack.count > 0 && c.description == dict[stack.last!] { //如果是右括号,并且匹配就出栈
    stack.removeLast()
    }else {
    return false
    }
    }
    }
    return stack.count == 0
    }
    }
    在LeetCode上也有很多种语言的解法,这里分享一个python[4]的解法

    7.内容总结

        我们来回顾一下今天讲的内容。栈是一种操作受限的数据结构,只支持入栈和出栈操作。后进先出是它最大的特点。我们还知道数据结构中的堆栈和内存中的堆栈不是同一个概念。我们也理解了栈在实际开发中的些应用,以及使用递归,当n值很大地时候,会有大量的临时变量被压如栈中而消耗内存。以及最后通过栈的核心思想来解LeetCode中比较经典的算法题。    相信你也真正的掌握了栈这种数据结构了。那赶紧动手敲代码来实践吧!

    参考资料:

    • 1.有效的括号:https://leetcode-cn.com/problems/valid-parentheses
    • 2.栈的定义:

      https://baike.baidu.com/item/%E6%A0%88/12808149?fr=aladdin

    • 3.斐波那契数列:

      https://baike.baidu.com/item/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97/99145?fr=aladdin 

    • 4.python语言实现:

      https://leetcode-cn.com/problems/valid-parentheses/solution/valid-parentheses-fu-zhu-zhan-fa-by-jin407891080/

    如果今天的分享对你有帮助的话,请毫不犹豫:分享、点赞、在看、收藏呀~
    你的鼓励将会是我创作的最大动力。

    c941bfbd2fc6cd2daad20b981191e81f.gif

    ◆Python 经典算法之 “ 选择排序 ”◆Python 之“栈为何物”◆Python 算法之一

    点个赞,点个在看再走吧~~~

    9ff53529f92e33da855f373d82ad896e.gif
    展开全文
  • 以下是详细代码,怎样把我添加单词保存到txt文档中? #include #include #include #define MAXWORD 25 #define MAXMEAN 50 struct record { //记录结构_读者 char word[MAXWORD+1]; //key ...
  • 关于大端小端概念,小端:数据高位字节存放在高地址内,数据低位... 典型体系结构中,一个字是4个字节,那么数据0x0A0B0C0D,在小端机器中从地址到高址存放方式为:0x0D,0x0C,0x0B,0x0A;  在大端模式中从

    关于大端小端的概念,小端:数据的高位字节存放在高地址内,数据的低位字节存放在低地址内。

                                    大端:数据的高位字节存放在低地址内,数据的低位字节存放在高地址内。

        典型的体系结构中,一个字是4个字节,那么数据0x0A0B0C0D,在小端机器中从地址到高址的存放方式为:0x0D,0x0C,0x0B,0x0A;

       在大端模式中从地址到高地址的存放方式为:0x0A,0xB,0x0C,0x0D;

       通用处理器中,ARM通常是大端模式,x86体系机构是小端模式。

       如果让你判断一个处理器的类型,你该如何编码实现呢,如果是用汇编语言,那这是一件非常容易的事情,向指定地址写一个数据,

       再逐个字节的读出来,就能很容易判断出大小端。那么用C语言如何实现呢? 

       方法一、通过读取同一地址的整型数据和字符数据来区别大端和小端  

     

    #include<stdio.h>
     
    void endianness()
    {
    	int a = 1;
    	int * pInt = &a;
    	char * pChar = (char *)pInt;
    	if(* pChar == 1)
    	{
    		printf("small endianness\n");
    	}
    	else
    	{
    		printf("big endianness\n");
    	}
    }
    
    void main()
    {
    	endianness();
    }


     

    方法二、通过union的共享内存特性,来判断机器类型 

    #include<stdio.h>
     
    union 
    {
    	char str;
    	int data;
    }dataUnion;
    
    void endianness()
    {
    
    	dataUnion.data = 0x00000001;
    	if(dataUnion.str == 0x0)
    	{
    		printf("big endianness\n");
    	}
    	else
    	{
    		printf("small endianness\n");
    	}
    }
    
    void main()
    {
    	endianness();
    }

     方法三、Linux的开发者,在内核中只用这样两句话,就判断了机器类型

    #include<stdio.h>
     
    static union 
    { 
    	char c[4]; 
    	unsigned long mylong;
    }endian_test = {{ 'l', '?', '?', 'b' } };
    #define ENDIANNESS ((char)endian_test.mylong)
    
    void main()
    {
    	printf("%c",ENDIANNESS);
    }



     

    展开全文
  • 证书层级结构

    千次阅读 2018-10-01 10:08:28
    一 点睛 用户需要使用认证机构公钥,对证书上数字签名...一个认证机构来验证另外一个认证机构公钥,这样关系可以迭代好几层。这样一种认证机构之间层级关系,我们可以用某公司内部PKI来类比。例如某公...

    一 点睛

    用户需要使用认证机构的公钥,对证书上的数字签名进行验证。

    那么,对于用来验证数字签名的认证机构的公钥,怎样才能判断它是合法的呢?对于认证机构的公钥,可以由其他认证机构施加数字签名,从而对认证机构的公钥进行验证,即生成一张认证机构的公钥证书。

    一个认证机构来验证另外一个认证机构的公钥,这样的关系可以迭代好几层。这样一种认证机构之间的层级关系,我们可以用某公司内部PKI来类比。例如某公司的组织结构如下,每一层组织都设有认证机构。

    假设Bob是札幌办事处的一名员工,札幌办事处员工的公钥由札幌办事处认证机构颁发的(因为这样更容易认证本人身份)。

    对于札幌办事处认证机构的公钥,则由北海道分公司认证机构颁发证书,而对于北海道分公司认证机构的公钥,则由东京总公司认证机构颁发证书,以此类推......。不过这个链条不能无限制延伸,总要有一个终点,如果这个终点就是东京总公司认证机构(即不存在更高一层的认证机构)的话,该认证机构一般就称根CA(Root CA)。而对于东京总公司认证机构,则由东京总公司认证机构自己来颁发证书,这种对自己的公钥进行数字签名的行为称为自签名。

    二 分析

    现在假设Alice要验证札幌办事处员工Bob的数字签名,那么Alice需要执行如下步骤进行验证。

    首先从最高层认证机构(根CA)开始。如果连根CA的公钥都不合法的话,那么就无法验证证书了,因此我们假设Alice所持有的东京总公司认证机构的公钥是合法的。

    接着,Alice取得北海道分公司认证机构的公钥证书,这个证书上面带有东京总公司认证机构的数字签名。Alice用合法的东京总公司认证机构的公钥对数字签名进行验证。如果验证成功,说明Alice取得了合法的北海道分公司认证机构的公钥。

    再接下来,Alice取的札幌办事处认证机构的公钥证书,这个证书上面带有北海道分公司认证机构的数字签名。Alice用合法的北海道认证机构的公钥对数字签名进行验证。如果验证成功,则说明Alice获得了合法的札幌办事处认证机构的公钥。

    最后,Alice取得札幌办事处员工Bob的公钥证书,这个证书上面带有札幌办事处认证机构的数字签名。Alice用合法的札幌办事处认证机构的公钥对数字签名进行验证。如果验证成功,则说明Alice获得了合法的札幌办事处员工Bob的公钥。

    上面就是Alice对Bob的数字签名进行验证的整个过程。当然,如此复杂的验证过程不会是由人来操作的,而是由电子邮件或者浏览器等软件自动完成的。

    三 认证机构的层级

    展开全文
  • 例3.11 从键盘读入一个...程序实现步骤是 从键盘输入一个英文字符 判断该英文字符大小写并转换成对应字母 输出转换后英文字符 该题关键问题是怎样判断字符大小写状态和实现转换有两种方式实现一种是根
  • 点击上方蓝,关注:无量测试之道 作者 |无量测试之道编辑 |小晴有效括号,刷过LeetCode也许对这道题很熟悉。1.开篇问题:有效括号[1] 假如...玩这个游戏时候,我们都是从下往上一个一个放;取时候,我们也...
  • 给你一个整数数组 nums 和一个正整数 k,请你判断是否可以把这个数组划分成一些由 k 个连续数字组成集合。 如果可以,请返回 True;否则,返回 False。 现在做了几十到贪心算法之后,发现贪心策略并不难找,而是用...
  • 通过我们已经学过知识,你可以编写一个最简单程序输出一个也许是程序世界中最有名词语: echo "Hello World!"; ?> First PHP page // Single line C++ style comment /* printing the message */ ...
  • 你必须知道495C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    6.22 如何在一个文件中判断声明为extern数组大小(例如,数组定义和大小在另一个文件中)?sizeof操作符似乎不行。 6.23 sizeof返回大小是以字节计算怎样才能判断数组中有多少个元素呢? 第7章 内存...
  •  颜色调整问题也是编程中的一个关键,为了达到按不同字符种类使用不同颜色目的,必须对文件中的字    符进行逐个判断,此处需要对字符编码有必要了解,比如汉字是由大于A0H 编码组成, 30H-39H为数字...
  • 《你必须知道495C语言问题》

    热门讨论 2010-03-20 16:41:18
    *4.15 我怎样一个int变量转换为char *型?我试了类型转换,但是不行。 52 第5章 空指针 53 空指针和空指针常量 53 5.1 臭名昭著空指针到底是什么? 53 5.2 怎样在程序里获得一个空指针? 54 5.3 用...
  • *4.15 我怎样一个int变量转换为char *型?我试了类型转换,但是不行。 52 第5章 空指针 53 空指针和空指针常量 53 5.1 臭名昭著空指针到底是什么? 53 5.2 怎样在程序里获得一个空指针? 54 5.3 用...
  • 001 第一个C程序 002 运行多个源文件 003 求整数之积 004 比较实数大小 005 字符输出 006 显示变量所占字节数 007 自增/自减运算 008 数列求和 009 乘法口诀表 010 猜数字游戏 011 模拟ATM(自动柜员机...
  • 昨天我们用比较精简文字讲了 Java 虚拟机结构,没看过...判断对象是否存活方式引用计数算法对应判断一个对象是否可以回收,我想引用计数一定是最容易被想到算法了吧。给每个对象加一个引用计数器,每当有一个地...
  • 昨天我们用比较精简文字讲了 Java 虚拟机结构,没看过可以直接从这里查看: 每日一问:你了解 Java 虚拟机...对应判断一个对象是否可以回收,我想引用计数一定是最容易被想到算法了吧。给每个对象加一个引用...
  • 6.22 如何在一个文件中判断声明为extern数组大小(例如,数组定义和大小在另一个文件中)?sizeof操作符似乎不行。  6.23 sizeof返回大小是以字节计算怎样才能判断数组中有多少个元素呢?  第7章 内存...
  • 以下代码利用两个char类型栈分别存取运算数和运算符,但在结束一次优先级高运算后(考虑到运算精度问题,故在程序中,将每次运算结果都保存为double型)可能会出现浮点值,这个值必须要压栈,并于下一个优先级...
  •  *4.15 我怎样一个int变量转换为char*型?我试了类型转换,但是不行。 第5章 空指针 空指针和空指针常量 5.1 臭名昭著空指针到底是什么? 5.2 怎样在程序里获得一个空指针? 5.3 用缩写指针比较...
  • 4.15 我怎样一个int变量转换为char *型?我试了类型转换,但是不行。 第5章 空指针 空指针和空指针常量 5.1 臭名昭著空指针到底是什么? 5.2 怎样在程序里获得一个空指针? 5.3 用缩写指针比较“if(p)”检查空...
  • *4.15 我怎样一个int变量转换为char *型?我试了类型转换,但是不行。 81 第5章 空指针 82 空指针和空指针常量 82 5.1 臭名昭著空指针到底是什么? 82 5.2 怎样在程序里获得一个空指针? 83 5.3 用缩写...
  • *4.15 我怎样一个int变量转换为char *型?我试了类型转换,但是不行。 81 第5章 空指针 82 空指针和空指针常量 82 5.1 臭名昭著空指针到底是什么? 82 5.2 怎样在程序里获得一个空指针? 83 5.3 用缩写...
  • 《数据结构 1800题》

    热门讨论 2012-12-27 16:52:03
    10.以下那一个术语与数据存储结构无关?(A )【北方交通大学 2001 一、2(2分)】 A.栈 B. 哈希表 C. 线索树 D. 双向链表 11.在下面程序段中,对 x赋值语句频度为(C )【北京工商大学 2001 一、10(3...
  •  4.15 我怎样一个int变量转换为char *型?我试了类型转换,但是不行。 第5章 空指针  空指针和空指针常量  5.1 臭名昭著空指针到底是什么?  5.2 怎样在程序里获得一个空指针?  5.3 用缩写指针比较“if...
  • 4.15 我怎样一个int变量转换为char *型?我试了类型转换,但是不行。 第5章 空指针 空指针和空指针常量 5.1 臭名昭著空指针到底是什么? 5.2 怎样在程序里获得一个空指针? 5.3 用缩写指针比较“if(p)”检查空...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 179
精华内容 71
关键字:

怎样判断一个字的结构