071.魔王语言翻译

举报
C语言与CPP编程 发表于 2022/05/01 22:38:31 2022/05/01
【摘要】 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h> /*定义全局变量*/ #define TRUE 1 #define FALSE 0 #define ...

  
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <conio.h>
  5. /*定义全局变量*/
  6. #define TRUE 1
  7. #define FALSE 0
  8. #define OK 1
  9. #define ERROR 0
  10. #define NULL 0
  11. #define OVERFLOW -2
  12. #define MAXSIZE 100
  13. #define stack_init_size 100
  14. #define stackincrement 10
  15. typedef char selemType;
  16. typedef char qelemType;
  17. typedef char elemType;
  18. typedef int status;
  19. char e;
  20. char demon[MAXSIZE];
  21. /* 类型及其基本操作*/
  22. typedef struct
  23. {
  24. selemType *base;
  25. selemType *top;
  26. int stacksize;
  27. }sqstack;
  28. status initstack (sqstack *s)
  29. {
  30. s->base=(selemType *)malloc(stack_init_size*sizeof(selemType));
  31. if(!s->base) exit (OVERFLOW);
  32. s->top=s->base;
  33. s->stacksize=stack_init_size;
  34. return OK;
  35. }/*创建栈*/
  36. status push (sqstack *s,selemType e)
  37. {
  38. if(s->top-s->base>=s->stacksize)
  39. {
  40. s->base=(elemType*) realloc(s->base,(s->stacksize+stackincrement)*sizeof(elemType))
  41. if(!s->base) exit(OVERFLOW);
  42. s->top=s->base+s->stacksize;
  43. s->stacksize+=stackincrement;
  44. }
  45. *(s->top++)=e;
  46. return OK;
  47. }/*入栈*/
  48. status pop(sqstack *s,selemType *e)
  49. {
  50. if(s->top==s->base) return ERROR;
  51. *e=*(--(s->top));
  52. return OK;
  53. }/*出栈*/
  54. /*队列类型及其基本操作*/
  55. typedef struct qnode
  56. {
  57. qelemType data;
  58. struct qnode *next;
  59. }qnode,*queueptr;
  60. typedef struct
  61. {
  62. queueptr front;
  63. queueptr rear;
  64. }linkqueue;
  65. status initqueue(linkqueue *q)
  66. {
  67. q->front=q->rear=(queueptr)malloc(sizeof(qnode));
  68. if(!q->front) exit(OVERFLOW);
  69. q->front->next=NULL;
  70. return OK;
  71. }/*创建队列*/
  72. status enqueue(linkqueue *q,qelemType e)
  73. {
  74. queueptr p;
  75. p=(queueptr)malloc(sizeof(qnode));
  76. if(!p) exit(OVERFLOW);
  77. p->data=e;
  78. p->next=NULL;
  79. q->rear->next=p;
  80. q->rear=p;
  81. return OK;
  82. }/*入队*/
  83. status dequeue(linkqueue *q,qelemType *e)
  84. {
  85. queueptr p;
  86. if(q->front==q->rear) return ERROR;
  87. p=q->front->next;
  88. *e=p->data;
  89. q->front->next=p->next;
  90. if(q->rear==p)
  91. {
  92. q->rear=q->front;
  93. }
  94. free(p);
  95. return OK;
  96. }/*出队*/
  97. /*括号内元素入栈处理函数*/
  98. void tempstack(sqstack *temps)
  99. {
  100. int i=0;
  101. char t;
  102. char c;
  103. c=demon[i];
  104. for(i=0;c!='#';i++)/*遍历数组*/
  105. {
  106. c=demon[i];
  107. if(c=='(')/*遇到开括号*/
  108. {
  109. t=demon[i+1];/*取括号中的首字母*/
  110. push(temps,t);/*入栈*/
  111. i++;/*指向首字母*/
  112. do
  113. {
  114. i++;
  115. c=demon[i];
  116. push(temps,c)/*第一次循环将次字母入栈*/;
  117. push(temps,t);/*再将首字母进栈*/
  118. }while(c!=')');/*直到括号中元素全部进栈*/
  119. pop(temps,&t);/*将多余进栈的首字母t出栈*/
  120. pop(temps,&t); /*将多余进栈的')'出栈*/
  121. }
  122. }
  123. }/*临时栈*/
  124. /*特殊入队函数*/
  125. void spenqueue(linkqueue *q,char key)
  126. {
  127. int j=0;
  128. char a[5];
  129. switch(key) /*判断大写字母对应的字符串*/
  130. {
  131. case'A':strcpy(a,"ase");break;
  132. case'B':strcpy(a,"tAdA");break;
  133. case'C':strcpy(a,"abc");break;
  134. case'D':strcpy(a,"def");break;
  135. case'E':strcpy(a,"ghi");break;
  136. case'F':strcpy(a,"klm");break;
  137. case'H':strcpy(a,"mop");break;
  138. default:strcpy(a,"???"); /*不能翻译的魔王语言以"???"输出*/
  139. }
  140. while(a[j]!='\0') /*如果数组还有字母*/
  141. {
  142. enqueue(q,a[j]);/*进队*/
  143. j++;
  144. }
  145. }/*特殊入队*/
  146. /*排序入队处理函数*/
  147. status sort(sqstack *s,linkqueue *q)
  148. {
  149. qnode b;
  150. int flag=0;/*大写字母监视哨置零*/
  151. int i;
  152. for(i=0;demon[ i]!='#';i++)/*遍历数组*/
  153. {
  154. b.data=demon[ i];
  155. if( ('a'<=b.data&&b.data<='z')||b.data=='?') /*如果是小写字母或者'?' 则直接进栈*/
  156. {
  157. enqueue(q,b.data);
  158. }
  159. else
  160. {
  161. if('A'<=b.data&&b.data<='Z') /*如果是大写字母,则调用特殊进栈函数,*/
  162. {
  163. spenqueue(q,b.data);
  164. flag=1; /*发现大写字母监视哨置1*/
  165. }
  166. else
  167. {
  168. if(b.data=='(')/*如果是括号*/
  169. {
  170. do
  171. {
  172. pop(s,&e);
  173. enqueue(q,e);
  174. }while(!(s->top==s->base)); /*只要栈不为空,则出栈进队*/
  175. while (b.data!=')') /*只要还指向括号内元素,就继续往后移,保证原括号内的元素不再进栈*/
  176. {
  177. i++;
  178. b.data=demon[i];
  179. }
  180. }
  181. }
  182. }
  183. }
  184. return flag;
  185. }/*排序*/
  186. /*主函数*/
  187. status main()
  188. {
  189. sqstack s1;
  190. linkqueue q1;
  191. int k=0;
  192. int flag=1;
  193. clrscr();
  194. printf("Please Input the Demon's Words:\n");
  195. printf("!: Less Than 30 Letters: )\n");
  196. printf("!: End with '#': )\n\t");
  197. scanf("%s",demon);
  198. printf("\n***************************************");
  199. initstack(&s1); /*创建栈*/
  200. initqueue(&q1); /*创建队*/
  201. tempstack(&s1); /*调用函数*/
  202. while (flag==1) /*如果有大写字母*/
  203. {
  204. k=0;
  205. flag=sort(&s1,&q1);
  206. while(q1.front!=q1.rear) /*重写demon[i ]*/
  207. {
  208. dequeue(&q1,&e);
  209. demon[k]=e;
  210. k++;
  211. }
  212. demon[k]='#';
  213. }
  214. demon[k]='\0';
  215. printf("\n***************************************");
  216. printf("\nThe Human Words:\n\t%s",demon);
  217. printf("\n***************************************");
  218. }

文章来源: blog.csdn.net,作者:程序员编程指南,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_41055260/article/details/124518266

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。