一、实验目的
1、掌握栈、队列的逻辑结构、存储结构及基本操作;
2、针对计算机领域复杂工程问题,能够综合运用数据结构的基本理论和设计方法,设计出合理的算法。
二、实验内容
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(" ");
}
}
六、测试和结果
第一题:
测试结果:银色 金色 青色 红色 黑色 黄色 白色
第二题:
甲子 乙丑 丙寅 丁卯 戊辰 己巳 庚午 辛未 壬申 癸酉 甲戌 乙亥 丙子 丁丑 戊寅 己卯 庚辰 辛巳 壬午 癸未 甲申 乙酉 丙戌 丁亥 戊子 己丑 庚寅 辛卯 壬辰 癸巳 甲午 乙未 丙申 丁酉 戊戌 己亥 庚子 辛丑 壬寅 癸卯 甲辰 乙巳 丙午 丁未 戊申 己酉 庚戌 辛亥 壬子 癸丑 甲寅 乙卯 丙辰 丁巳 戊午 己未 庚申 辛酉 壬戌 癸亥
七、用户手册
第一题:直接运行即可,程序会按照题目要求输出扯脸的顺序
第二题:同上