数据结构--栈、队列

一、实验目的

1、掌握栈、队列的逻辑结构、存储结构及基本操作;

2、针对计算机领域复杂工程问题,能够综合运用数据结构的基本理论和设计方法,设计出合理的算法。

二、实验内容

1、变脸是运用在川剧艺术中塑造人物的一种特技。是揭示剧中人物内心思想感情的一种浪漫主义手法。相传“变脸”是古代人类在面对凶猛野兽的时候,为了生存把自己脸部用不同的方式勾画出不同形态,以吓跑入侵的野兽。川剧把“变脸”搬上舞台,用绝妙的技巧使它成为一门独特的艺术。变脸的手法大体上分为三种: “抹脸”、“吹脸”、“扯脸”。此外,还有一种“运气”变脸。“扯脸”是比较复杂的一种变脸方法。它是事前将脸谱画在一张一张的绸子上,剪好,每张脸谱上都系一把丝线,再一张一张地贴在脸上。丝线则系在衣服的某一个顺手而又不引人注目的地方(如腰带上之类)。随著剧情的进展,在舞蹈动作的掩护下,一张一张地将它扯下来。

假设所贴脸谱的颜色顺序是白色、黄色、黑色、红色、青色、金色、银色,请用所学知识输出扯脸的序列。

  1. 天干地支纪年法,源于中国。中国自古便有十天干与十二地支,简称“干支”,取意于树木的干和枝。十天干即:甲、乙、丙、丁、戊(wù)、己、庚、辛、壬(rén)、癸(guǐ);十二地支即:子、丑、、卯(mǎo)、辰、(sì)、(wèi)、申、(yǒu)、(xu一声)、。十二地支又与十二生肖对应:子鼠、丑牛、寅虎、卯兔、辰龙、巳蛇、午马、未羊、申猴、酉鸡、戌狗、亥猪。十天干和十二地支依次相配,组成六十个基本单位,六十甲子。天干地支的发明影响深远,目前依旧在使用天干地支,用于历法、术数、计算、命名等各方面。

请设计程序生成六十甲子。

提示:创建两个循环队列,一个循环队列用于存放十天干,一个循环队列用于存放十二地支,若天干队列为空,则让十天干入队列;若地支队列为空,则让十二地支依次入队列;若两个队都不为空时,两个队列各取一个元素出队列,并在屏幕上输出配对的天干地支;直到输出六十个甲子,程序结束。

三、算法描述

第一题1.定义链表节点2.创建链表3.逆序输出

第二题1创建空栈并初始化2向栈内存入元素3输出

四、详细设计

第一题:                       

第二题:

  

五、程序代码

第一题:

#include<stdio.h>

#include<stdlib.h>

//定义链表节点

typedef struct LNode

{ int data;

  struct LNode *next;

} LNode, *Linklist;

//创建链表

Linklist create()

{ int i,n=7,j=1; //i用于下面循环,n用来存放有效节点的字数

  Linklist p,L;

  L= (Linklist)malloc(sizeof(LNode)); // 分配一个不存放有效数据的头结点

  L->next=NULL;

  for(i = 0; i < n; i++)//白色、黄色、黑色、红色、青色、金色、银色->1.2.3.4.5.6.7

  { p = (Linklist)malloc(sizeof(LNode));//生成新节点

    p->data = j;//输入

j++;

    p->next = L->next;

    L->next = p;

  }

  return L; //返回头节点 ;

}

//逆序输出

void put(Linklist L)

{ Linklist p;

  p = L->next;

  while(p != NULL)//白色、黄色、黑色、红色、青色、金色、银色

  {

  if(p->data==1)

  printf("白色 ");

  else if(p->data==2)

  printf("黄色 ");

  else if(p->data==3)

  printf("黑色 ");

  else if(p->data==4)

  printf("红色 ");

  else if(p->data==5)

  printf("青色 ");

  else if(p->data==6)

  printf("金色 ");

  else

  printf("银色 ");

    p = p->next;

  }

  printf("\n");

}

int main(void)

{ Linklist L;

  L=create();

  put(L);

}

第二题

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

typedef struct

{

    char g[20][5];

    int wz;

}test;

void InitStack(test *cs)

{

  cs->wz=0;

}

int jiance(test *cs,int k)

{

if(cs->wz==k)

{

return 0;

}else{

return 1;

}

}

void Push(test *cs,char m[],int k)

{

if(cs->wz<k)

{

strcpy(cs->g[cs->wz],m);

cs->wz++;

}

}

void Pop(test *cs)

{

    printf("%s",cs->g[cs->wz]);

cs->wz++;

}

int main()

{

    int j,te1=2,te2=2;

     char c[12][5]={"子","丑","寅","卯","辰","巳","午","未","申",

             "酉","戌","亥"};

     char z[10][5]={"甲","乙","丙","丁","戊","己","庚","辛","壬",

             "癸"};

     test *ft1,*ft2;

 ft1=(test*)malloc(sizeof(test));        

   ft2=(test*)malloc(sizeof(test));      

     InitStack(ft1);

    InitStack(ft2);

    for(j=0;j<12;j++)

    {

Push(ft2,z[j],10);

     Push(ft1,c[j],12);

}

InitStack(ft2);

InitStack(ft1);

     for(j=0;j<60;j++)

    {

     if(jiance(ft1,12)==0)

     {

     InitStack(ft1);

}

if(jiance(ft2,10)==0)

     {

     InitStack(ft2);

}

Pop(ft2);

        Pop(ft1);

        printf(" ");

}

}

六、测试和结果

第一题:

测试结果:银色 金色 青色 红色 黑色 黄色 白色

第二题:

甲子 乙丑 丙寅 丁卯 戊辰 己巳 庚午 辛未 壬申 癸酉 甲戌 乙亥 丙子 丁丑 戊寅 己卯 庚辰 辛巳 壬午 癸未 甲申 乙酉 丙戌 丁亥 戊子 己丑 庚寅 辛卯 壬辰 癸巳 甲午 乙未 丙申 丁酉 戊戌 己亥 庚子 辛丑 壬寅 癸卯 甲辰 乙巳 丙午 丁未 戊申 己酉 庚戌 辛亥 壬子 癸丑 甲寅 乙卯 丙辰 丁巳 戊午 己未 庚申 辛酉 壬戌 癸亥

七、用户手册

第一题:直接运行即可,程序会按照题目要求输出扯脸的顺序

第二题:同上

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值