第二章、栈、队列、链表

第一节、解密QQ号——队列
p29 解密QQ号——队列

#include <stdio.h>
int main()
{
    int q[102]={0,6,3,1,7,5,8,9,2,4},head,tail;
    //int i;
    //初始化队列
    head=1;
    tail=10; //队列中已经有9个元素了,tail执向的队尾的后一个位置
    while(head<tail) //当队列不为空的时候执行循环
    {
        //打印队首并将队首出队
        printf("%d ",q[head]);
        head++;

        //先将新队首的数添加到队尾
        q[tail]=q[head];
        tail++;
        //再将队首出队
        head++;
    }

    getchar();getchar();
    return 0;
}

p30
用结构体实现队列操作

#include <stdio.h>
struct queue
{
    int data[100];//队列的主体,用来存储内容
    int head;//队首
    int tail;//队尾
};

int main()
{
    struct queue q;
    int i;
    //初始化队列
    q.head=1;
    q.tail=1;
    for(i=1;i<=9;i++)
    {
        //依次向队列插入9个数
        scanf("%d",&q.data[q.tail]);
        q.tail++;
    }

    while(q.head<q.tail) //当队列不为空的时候执行循环
    {
        //打印队首并将队首出队
        printf("%d ",q.data[q.head]);
        q.head++;

        //先将新队首的数添加到队尾
        q.data[q.tail]=q.data[q.head];
        q.tail++;
        //再将队首出队
        q.head++;
    }

    getchar();getchar();
    return 0;
}

/*

6 3 1 7 5 8 9 2 4

*/

第二节、解密回文——栈
p34 判断回文字符串

#include <stdio.h>
#include <string.h>
int main()
{
    char a[101],s[101];
    int i,len,mid,next,top;

    gets(a); //读入一行字符串
    len=strlen(a); //求字符串的长度
    mid=len/2-1; //求字符串的中点

    top=0;//栈的初始化
    //将mid前的字符依次入栈
    for(i=0;i<=mid;i++)
        s[++top]=a[i];

    //判断字符串的长度的是奇数还是偶数,并找出需要进行字符匹配的起始下标
    if(len%2==0)
        next=mid+1;
    else
        next=mid+2;

    //开始匹配
    for(i=next;i<=len-1;i++)
    {
        if(a[i]!=s[top])
            break;
        top--;
    }

    //如果top的值为0,则说明栈内的所有的字符都被一一匹配了
    if(top==0)
        printf("YES");
    else
        printf("NO");

    getchar();getchar();
    return 0;
}

/*

ahaha
hahaha

*/

第三节、纸牌游戏——小猫钓鱼
p40 纸牌游戏——小猫钓鱼

#include <stdio.h>
struct queue
{
  int data[1000];
  int head;
  int tail;
};

struct stack
{
  int data[10];
  int top;
};

int main()
{
  struct queue q1, q2;
  struct stack s;
  int book[10];
  int i, t;

  //初始化队列
  q1.head = 1;
  q1.tail = 1;
  q2.head = 1;
  q2.tail = 1;
  //初始化栈
  s.top = 0;
  //初始化用来标记的数组,用来标记哪些牌已经在桌上
  for(i = 1; i <= 9; i++)
    book[i] = 0;

  //依次向队列插入6个数
  //小哼手上的6张牌
  for(i = 1; i <= 6; i++)
  {
    scanf("%d", &q1.data[q1.tail]);
    q1.tail++;
  }
  //小哈手上的6张牌
  for(i = 1; i <= 6; i++)
  {
    scanf("%d", &q2.data[q2.tail]);
    q2.tail++;
  }
  while(q1.head < q1.tail && q2.head < q2.tail)
  {
    //当队列不为空的时候执行循环
    t = q1.data[q1.head]; //小哼出一张牌
    //判断小哼当前打出的牌是否能赢牌
    if(book[t] == 0)
    {
      //表明桌上没有牌面为t的牌
      //小哼此轮没有赢牌
      q1.head++; //小哼已经打出一张牌,所以要把打出的牌出队
      s.top++;
      s.data[s.top] = t; //再把打出的牌放到桌上,即入栈
      book[t] = 1; //标记桌上现在已经有牌面为t的牌
    }
    else
    {
      //小哼此轮可以赢牌
      q1.head++; //小哼已经打出一张牌,所以要把打出的牌出队
      q1.data[q1.tail] = t; //紧接着把打出的牌放到手中牌的末尾
      q1.tail++;
      while(s.data[s.top] != t)
      {
        //把桌上可以赢得的牌依次放到手中牌的末尾
        book[s.data[s.top]] = 0; //取消标记
        q1.data[q1.tail] = s.data[s.top]; //依次放入队尾
        q1.tail++;
        s.top--; //栈中少了一张牌,所以栈顶要减1
      }
    }

    t = q2.data[q2.head]; //小哈出一张牌
    //判断小哈当前打出的牌是否能赢牌
    if(book[t] == 0)
    {
      //表明桌上没有牌面为t的牌
      //小哈此轮没有赢牌
      q2.head++; //小哈已经打出一张牌,所以要把打出的牌出队
      s.top++;
      s.data[s.top] = t; //再把打出的牌放到桌上,即入栈
      book[t] = 1; //标记桌上现在已经有牌面为t的牌
    }
    else
    {
      //小哈此轮可以赢牌
      q2.head++; //小哈已经打出一张牌,所以要把打出的牌出队
      q2.data[q2.tail] = t; //紧接着把打出的牌放到手中牌的末尾
      q2.tail++;
      while(s.data[s.top] != t)
      {
        //把桌上可以赢得的牌依次放到手中牌的末尾
        book[s.data[s.top]] = 0; //取消标记
        q2.data[q2.tail] = s.data[s.top]; //依次放入队尾
        q2.tail++;
        s.top--;
      }
    }
  }

  if(q2.head == q2.tail)
  {
    printf("小哼win\n");
    printf("小哼当前手中的牌是");
    for(i = q1.head; i <= q1.tail - 1; i++)
      printf(" %d", q1.data[i]);
    if(s.top > 0)
    {
      //如果桌上有牌则依次输出桌上的牌
      printf("\n桌上的牌是");
      for(i = 1; i <= s.top; i++)
        printf(" %d", s.data[i]);
    }
    else
      printf("\n桌上已经没有牌了");
  }
  else
  {
    printf("小哈win\n");
    printf("小哈当前手中的牌是");
    for(i = q2.head; i <= q2.tail - 1; i++)
      printf(" %d", q2.data[i]);
    if(s.top > 0)
    {
      //如果桌上有牌则依次输出桌上的牌
      printf("\n桌上的牌是");
      for(i = 1; i <= s.top; i++)
        printf(" %d", s.data[i]);
    }
    else
      printf("\n桌上已经没有牌了");
  }

  getchar();
  getchar();
  return 0;
}

/*

2 4 1 2 5 6
3 1 3 5 6 4

*/

第四节、链表
p46 引用指针、输出变量值

#include <stdio.h>
int main()
{
  int a=10;
  int *p; //定义一个指针p
  p = &a; //指针p获取变量a地址
  *p = 10; //向指针p所指向的内存空间中存入10
  printf("%d", *p); //输出指针p所指向的内存中的值
  getchar(); getchar();
  return 0;
}

p47 用malloc函数申请内存

#include <stdio.h>
#include <stdlib.h>
int main()
{
  int *p; //定义一个指针p
  p = (int*)malloc(sizeof(int)); //指针p获取动态分配的内存空间地址
  *p = 10; //向指针p所指向的内存空间中存入10
  printf("%d", *p); //输出指针p所指向的内存中的值
  getchar();
  getchar();
  return 0;
}

p50 建立链表,并输出链表中的数据

#include <stdio.h>
#include <stdlib.h>
//这里创建一个结构体用来表示链表的结点类型
struct node
{
  int data;
  struct node *next;
};
int main()
{
  struct node *head, *p, *q, *t;
  int i, n, a;
  scanf("%d", &n);
  head = NULL; //头指针初始为空
  for(i = 1; i <= n; i++)
  //循环读入n个数
  {
    scanf("%d", &a);
    //动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点
    p = (struct node*)malloc(sizeof(struct node));
    p->data = a; //将数据存储到当前结点的data域中
    p->next = NULL;
    //设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空
    if(head == NULL)
      head = p;
    //如果这是第一个创建的结点,则将头指针指向这个结点
    else
      q->next = p;
    //如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点
    q = p; //指针q也指向当前结点
  }
  //输出链表中的所有数
  t = head;
  while(t != NULL)
  {
    printf("%d ", t->data);
    t = t->next; //继续下一个结点
  }
  getchar();
  getchar();
  return 0;
}

/*

9
2 3 5 8 9 10 18 26 32

*/

p52 在链表中插入一个数据

#include <stdio.h>
#include <stdlib.h>
//这里创建一个结构体用来表示链表的结点类型
struct node
{
  int data;
  struct node *next;
};
int main()
{
  struct node *head, *p, *q, *t;
  int i, n, a;
  scanf("%d", &n);
  head = NULL; //头指针初始为空
  for(i = 1; i <= n; i++)
  //循环读入n个数
  {
    scanf("%d", &a);
    //动态申请一个空间,用来存放一个结点,并用临时指针p指向这个结点
    p = (struct node*)malloc(sizeof(struct node));
    p->data = a; //将数据存储到当前结点的data域中
    p->next = NULL;
      //设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空
    if(head == NULL)
      head = p;
    //如果这是第一个创建的结点,则将头指针指向这个结点
    else
      q->next = p;
    //如果不是第一个创建的结点,则将上一个结点的后继指针指向当前结点
    q = p; //指针q也指向当前结点
  }

  scanf("%d", &a); //读入待插入的数
  t = head; //从链表头部开始遍历

  while(t != NULL)
  //当没有到达链表尾部的时候循环
  {
    if(t->next->data > a)
    //如果当前结点下一个结点的值大于待插入数,将数插入到中间
    {
      p = (struct node*)malloc(sizeof(struct node));
        //动态申请一个空间,用来存放新增结点
      p->data = a;
      p->next = t->next; //新增结点的后继指针指向当前结点的后继指针所指向的结点
      t->next = p; //当前结点的后继指针指向新增结点
      break; //插入完毕退出循环
    }
    t = t->next; //继续下一个结点
  }
  //输出链表中的所有数
  t = head;
  while(t != NULL)
  {
    printf("%d ", t->data);
    t = t->next; //继续下一个结点
  }
  getchar();
  getchar();
  return 0;
}

/*

9
2 3 5 8 9 10 18 26 32
6

*/

第五节、模拟链表
p54 用数组模拟链表

#include <stdio.h>
int main()
{
  int data[101], right[101];
  int i, n, t, len;
  //读入已有的数
  scanf("%d", &n);
  for(i = 1; i <= n; i++)
    scanf("%d", &data[i]);
  len = n;
  //初始化数组right
  for(i = 1; i <= n; i++)
  {
    if(i != n)
      right[i] = i + 1;
    else
      right[i] = 0;
  }
  //直接在数组data的末尾增加一个数
  len++;
  scanf("%d", &data[len]);
  //从链表的头部开始遍历
  t = 1;
  while(t != 0)
  {
    if(data[right[t]] > data[len])
    //如果当前结点下一个结点的值大于待插入数,将数插入到中间
    {
      right[len] = right[t];
        //新插入数的下一个结点标号等于当前结点的下一个结点编号
      right[t] = len; //当前结点的下一个结点编号就是新插入数的编号
      break; //插入完成跳出循环
    }
    t = right[t];
  }
  //输出链表中所有的数
  t = 1;
  while(t != 0)
  {
    printf("%d ", data[t]);
    t = right[t];
  }
  getchar();
  getchar();
  return 0;
}

/*

9
2 3 5 8 9 10 18 26 32
6

*/

oj:

以后整理。。

Top

时间: 2024-11-08 19:03:20

第二章、栈、队列、链表的相关文章

第04章 栈和队列

栈 队列 优先级队列 本章涉及到的三种存储数据类型:栈 队列 优先级队列 本章涉及到的存储数据类型是算法构思的辅助工具,而不仅仅是存储数据的工具.数据结构的生命周期比较短,在程序结束时,对应的数据结构的生命周期随之结束. 栈 队列 优先级队列是比较抽象的数据结构,通过接口对三种数据结构进行定义和实现,而实现的过程对用户来说是屏蔽的. 栈 (后进先出) 栈只允许访问一个数据项,即最后插入的项,当最后一项被移除时,才能对倒数第二项进行操作,依次类推. 栈的操作有两种,入栈和出栈,push  pop.

算法(第四版)学习笔记之java实现栈和队列(链表实现)

下压堆栈(链表实现): import java.util.Iterator; public class LinkedStack<Item> implements Iterable<Item> { public class Node { Item item; Node next; } private Node frist; private int N = 0; public boolean isEmpty() { return N == 0; } public int size()

【C语言探索之旅】 第一部分第四课第二章:变量的世界之变量声明

内容简介 1.课程大纲 2.第一部分第四课第二章:变量的世界之变量声明 3.第一部分第四课第三章预告:变量的世界之显示变量内容 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算符 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理

&lt;数据结构与算法分析 C++描述&gt; 表/栈/队列

这一章主要内容: * 抽象数据类型(ADT)的概念 * 实现表/栈/队列 * 了解这三个数据结构的应用场景 1. ADT ADT: abstract data type, 是抽象的数学模型,在该模型上定义了一系列的操作.使用它的人,不需要了解它的存储方式,只关心它的逻辑特征.可以使用三元组的方法来表示(D,S,P),D是数据对象,S是数据之间的关系,P是对数据的基本操作,具体介绍,可以参考帖子:点击打开链接 2. 表ADT 表的数据自然是单个元素,而元素之间的关系是前驱与后继,操作包括查找/插入

java面向对象的栈 队列 优先级队列的比较

栈 队列 有序队列数据结构的生命周期比那些数据库类型的结构(比如链表,树)要短得多.在程序操作执行期间他们才被创建,通常用他们去执行某项特殊的任务:当完成任务之后,他们就会被销毁.这三个数据结构还有一个特点就是访问是受到限制的,即在特定时刻只有一个数据项可以被读取或者被删除,但是所谓的移除并不是真的删除,数据项依然在这些数据结构中,只不过因为指针已经指向其他数据项,没有办法访问到,当添加新的数据项时,当初移除的数据项被替代从而永远消失. 栈 队列 优先级队列的模拟思想 1.栈:栈遵循先进后出(F

流程python学习笔记:第二章

第二章开始介绍了列表这种数据结构,这个在python是经常用到的结构 列表的推导,将一个字符串编程一个列表,有下面的2种方法.其中第二种方法更简洁.可读性也比第一种要好 str='abc' string=[] for s in str:     print string.append(s) ret=[s for s in str] print ret 用这种for-in的方法来推导列表,有个好处就是不会有变量泄露也就是越界的问题.这在c语言中是需要特别注意的问题. 对于两个以上的列表推导作者用到

java 集合 Connection 栈 队列 及一些常用

800x600 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priori

[Effective Java]第二章 创建和销毁对象

第一章      前言 略... 第二章      创建和销毁对象 1.            考虑用静态工厂方法代替构造器 创建对象方法:一是最常用的公有构造器,二是静态工厂方法.下面是一个Boolean的简单示例: public static Boolean valueOf(boolean b) { return (b ? Boolean.TRUE : Boolean.FALSE); } l  静态工厂方法与构造器不同的第一大优势在于,它们有名称. 作用不同的公有构造器只能通过参数来区别(因

windows7内核分析之x86&amp;x64第二章系统调用

windows7内核分析之x86&x64第二章系统调用 2.1内核与系统调用 上节讲到进入内核五种方式 其中一种就是 系统调用 syscall/sysenter或者int 2e(在 64 位环境里统一使用 syscall/sysret 指令,在 32 位环境里统一使用 sysenter/sysexit 在 compatibility 模式下必须切换到 64 位模式,然后使用 syscall/sysret 指令 注释:32位cpu是x86模式 也叫legacy模式 再说清楚点 就是包含了实模式:可

数据结构第二章小结

第二章主要学习的是线性表,其中包含了顺序表以及链表,顺序表有两种结构体定义,一种是指针,再申请相应数组空间,一种是直接定义数组,前者数组为堆空间,后者则为栈空间,如果数组长度过大,得考虑空间是否充足问题,因而前者适用性更好: 链表主要为单链表,循环链表,双向链表:主要涉及到删除.查找.插入等操作,在学习链表过程中,主要问题是没能充分理解语句的意思,在插入语句中,类似p=s(p为辅助指针.s为指向新结点的指针)总是理解为这一步就插入成功了,插入应该是通过辅助指针来改变所指向的结点的数据域,这样才是