很多东西都在变,只有我还是当年那个不会C++只会C的笨蛋

魔王的语言

我的思路:局部栈,整体队列。

1队列:整个字符串处理采用队列。先进先出,逐个处理。

2栈:遇到“()"创建栈,先进后出,实现“倒过来”。处理之后继续队列处理。

第一遍

#include <stdio.h>
#include <stdlib.h>
//魔王语言
typedef struct QNode {char a;struct QNode* next;
}QNode;
//入队
QNode* enQueue(QNode* rear, char x) {QNode* enElem = (QNode*)malloc(sizeof(QNode));enElem->a = x;enElem->next = NULL;//1、用节点包裹入队元素rear->next = enElem;//2、新节点与rear节点建立逻辑关系rear = enElem;//3、rear指向新节点  return rear;//返回新的rear,为后续新元素入队做准备
}
//出队
char DeQueue(QNode* top) {if (top->next == NULL)return '0';QNode* p = top->next;top->next = p->next;char a = p->a;free(p);return a;
}
//入栈
QNode* push(QNode* stack, char x)
{QNode* line = (QNode*)malloc(sizeof(QNode));line->a=x;line->next = stack;//新节点 stack = line;//更新 return stack;
}
//出栈
char pop(QNode* stack)
{char a; if (stack->next != NULL&&stack) {QNode* p = stack;stack = stack->next;a = p->a;free(p);return a;}elsereturn '0';
}
int main()
{char a,b; QNode* queue = (QNode*)malloc(sizeof(QNode));queue->next = NULL;QNode* q = queue,*top=queue;while (1){a=getchar();if( a>='a'&&a<='z' || a == 'A' || a =='B'||a=='('||a==')')q = enQueue(q, a);else break;}  while (top){ //正常入队列a = DeQueue(top);if (a >= 'a' && a <= 'z')printf("%c",a);//人类语言else if (a == 'B')printf("tsaedsae");else if (a == 'A')printf("sae");else //stack a-->'('{b= DeQueue(top);//更新QNode*stack= (QNode*)malloc(sizeof(QNode));while (a != ')'){a= DeQueue(top);stack = push(stack, a);}pop(stack); //pop(stack);//弹出”)while (1){if (b >= 'a' && b <= 'z')printf("%c", b);//人类语言else if (b == 'B')printf("tsaedsae");else //if (b == 'A')printf("sae");a = pop(stack);if (a >= 'a' && a <= 'z')printf("%c", a);//人类语言else if (a == 'B')printf("tsaedsae");else if (a == 'A')printf("sae");else //if (a == '0')break;}}}getchar(); return 1;
}

结果错误,用好几个printf检查出来,应该是因为pop函数返回值不是stack,没有把改变的结果返回回去,导致存放栈中的从来没有被删除成功过。

第二遍

#include <stdio.h>
#include <stdlib.h>
//魔王语言
typedef struct QNode {char a;struct QNode* next;
}QNode;
//入队
QNode* enQueue(QNode* rear, char x) {QNode* enElem = (QNode*)malloc(sizeof(QNode));enElem->a = x;enElem->next = NULL;//1、用节点包裹入队元素rear->next = enElem;//2、新节点与rear节点建立逻辑关系rear = enElem;//3、rear指向新节点  return rear;//返回新的rear,为后续新元素入队做准备
}
//出队
char DeQueue(QNode* top) {if (top->next == NULL)return '0';QNode* p = top->next;top->next = p->next;char a = p->a;free(p);return a;
}
//入栈
QNode* push(QNode* stack, char x)
{QNode* line = (QNode*)malloc(sizeof(QNode));line->a=x;line->next = stack;//新节点 stack = line;//更新 return stack;
}
//出栈
QNode* pop(QNode* stack)
{if (stack->next != NULL&&stack) {QNode* p = stack;stack = stack->next;free(p);}return stack;
}
int main()
{char a,b; QNode* queue = (QNode*)malloc(sizeof(QNode));queue->next = NULL;QNode* q = queue,*top=queue;while (1){a=getchar();if( a>='a'&&a<='z' || a == 'A' || a =='B'||a=='('||a==')')q = enQueue(q, a);else break;}  while (top){ //正常入队列a = DeQueue(top);if (a >= 'a' && a <= 'z')printf("%c",a);//人类语言else if (a == 'B')printf("tsaedsae");else if (a == 'A')printf("sae");else //stack a-->'('{b= DeQueue(top);//更新QNode*stack= (QNode*)malloc(sizeof(QNode));while (a != ')'){a= DeQueue(top);stack = push(stack, a);}//stack=pop(stack); //弹出”)while (1){if (b >= 'a' && b <= 'z')printf("%c", b);//人类语言else if (b == 'B')printf("tsaedsae");else //if (b == 'A')printf("sae");if (stack->next != NULL)a = stack->next->a;elsebreak;stack = pop(stack);if (a >= 'a' && a <= 'z')printf("%c", a);//人类语言else if (a == 'B')printf("tsaedsae");else if (a == 'A')printf("sae");else //if (a == '0')break;}}  //其实stack和queue的定义是一样的,只是操作不一样。}return 1;
}

本地测试没有问题但是结果判定为超时(耗时1006ms)。

问题:效率低,应该先(倒着存放进去)存放在栈当中,局部使用队列。

第三遍:数组

数组就是万能的,吹爆数组。

#include <stdio.h>
void stack(int i, int k, char word[])
{//思路:递归解决多层嵌套问题
//功能:打印一对儿括号里面的内容
//传入参数:i,k;第一个和')'的位置,word;字符串//i:用来打印第一位int j, begin;if (i == k )return;//空括号else{//第一位if (word[i] == 'B')printf("tsaedsae");else if (word[i] == 'A')printf("sae");else printf("%c", word[i]);//因为没有考虑(())情况}for (j = k - 1;j > i; j--){if (word[j] == '(')     continue;if (word[j] == ')'){for (begin = j; word[begin] != '('; begin--)   ;stack(begin+1, j, word);j = begin;}else{if (word[j] == 'B')printf("tsaedsae");else if (word[j] == 'A')printf("sae");else printf("%c", word[j]);}if (word[i] == 'B')printf("tsaedsae");else if (word[i] == 'A')printf("sae");else printf("%c", word[i]);//因为没有考虑(())情况}
}
int main()
{char word[1000] = { 0 };  scanf_s("%s", word,1000);int i=0, begin=0,k;while (1){if (word[i] == 'B')printf("tsaedsae");else if (word[i] == 'A')printf("sae");else if (word[i] == ')');else if (word[i] == '('){begin = i + 1; i++;for (k = 1; k ; i++){//找到endif (word[i] == '(')k++;//k标记括号的数目else if (word[i] == ')')k--;if (k <= 0)// once k=0, break instantbreak;}stack(begin,i, word);}else//(word[i] >= 'a' && word[i] <= 'z')printf("%c", word[i]);i++;if(word[i]==0)          break;//终止} return 0;
}

题上明明没有说有CDEF情况,我咋能想到还需要考虑别的大写字母呢,改上这一点之后就好了

补充:

涉及连续嵌套的时候,不同的理解会造成不同的结果。
比如:                (RMRGRJRDRORsaeRGRDFGA)=RsaeRGRFRDRRRGRRReRaRsRRRORRRDRRRJRRRGRRRMR
  还是((RGAODJGM)DFGA) =RsaeRGRFRDRRRGRRRsaeRRRORRRDRRRJRRRGRRRMR

再见!魔王!

栈和队列练习(C语言):魔王的语言相关推荐

  1. 【数据结构初阶】:栈和队列的实现(用C语言实现,附图详解和附源码)

    文章目录 栈的实现: 一.栈的概念和性质 二.栈的实现思路 三.栈的相关变量内存布局图 四.栈的初始化和销毁 五.栈的接口实现: 1.入栈 2.出栈 3.获取栈顶的数据 4.获取栈的元素个数 5.判断 ...

  2. 栈和队列-----重制版

    本期我们来讲解栈和队列的实现,相比之前的变的简洁了,但整体变化不大,大家也可以看看之前写的 (1条消息) 栈和队列及其多种接口实现-c语言_KLZUQ的博客-CSDN博客 目录 栈的结构 栈的初始化 ...

  3. 栈和队列:魔王语言解释

    一.程序运行环境 1.操作系统: Windows 10 X64 2.IDE:Visual Studio 2019 二.问题描述 三.程序设计思路 (1)首先实现栈和队列的基本操作,栈和队列都采用顺序存 ...

  4. 用栈和队列实现魔王语言

    问题描述: 魔王总是使用自己的一种非常精炼而抽象的语言讲话,没有人能听懂,但他的语言是可以逐步解释成人能听懂的语言的,因为它的语言是由以下两种形式的规则由人的语言逐步抽象上去的: (1) α→β1β2 ...

  5. Leetcode刷题 225题:用队列实现栈(基于Java和c++两种语言)

    ** Leetcode刷题 225题:用队列实现栈(基于Java和c++两种语言) ** 题目: 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top( ...

  6. Leetcode刷题 232题:用栈实现队列(基于python3和c++两种语言)

    Leetcode刷题 232题:用栈实现队列(基于python3和c++两种语言) 题目: 使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部. pop() – 从队列首部移除元 ...

  7. python中栈的描述是_数据结构与算法:Python语言描述 栈和队列.ppt

    数据结构与算法:Python语言描述 栈和队列 迷宫问题 迷宫问题的特点: 存在一集可能位置,一些位置相互连通,一步可达 一个位置可能连通若干位置,出现向前探查的多种可能(有分支) 目标是找到一条路径 ...

  8. 数据结构与算法(C语言) | 栈和队列——栈(自己做过测试)

    栈是一种重要的线性结构,通常称,栈和队列是限定插入和删除只能在表的"端点"进行的线性表.(后进先出) –栈的元素必须"后进先出". –栈的操作只能在这个线性表的 ...

  9. go int 转char_GO语言实现 一 栈和队列

    线性表中,栈和队列是非常重要的两种数据结构,本文将就这两种数据结构进行 golang语言实现 参考:go语言中文文档:www.topgoer.com 转自:https://www.jianshu.co ...

最新文章

  1. RxJava操作符在android中的使用场景详解(一)
  2. C/S,B/S的应用的区别
  3. hashmap储存有向图_java-对后边缘进行运算以获取有向图中的循环数
  4. 对原生ajax的理解
  5. spring项目启动执行特定方法
  6. vue里面is_vue中的is
  7. 长江浪花~朵儿朵尔朵
  8. python常用模块用法_python笔记之常用模块用法分析
  9. 浏览器href自动解析uri(执行urldecode)
  10. python历史时间轴可视化_TimeLine一个基于Python的时间轴创建者 | MOS86
  11. weka与mysql相连_Weka与MySQL连接配置
  12. 一天2篇Nature!任职同一高校,这对教授夫妻同时发表2项医学新成果
  13. 报表工具——开源还是商用
  14. linux su无效_linux系统 su切换用户失败情况
  15. 7.STM32C8T6+DHT11在OLED上显示 温度,湿度
  16. Java 实现OCR 识别图像文字(手写中文)----tess4j
  17. java 1.7.0 51下载 64_JD7K_jd7k-7u51-windows-x64.exe V7.0u51 64位 官方版
  18. POI中设置单元格背景色
  19. CentOS安装mysql*.rpm提示conflicts with file from package的解决办法
  20. 被百度接纳了一年的熊孩子!

热门文章

  1. 内存空间为什么要分栈和堆?
  2. excel一列求和_EXCEL筛选状态下的求和问题
  3. 为什么很多程序员,成为不了技术大牛?
  4. Ps制作信号干扰故障风艺术效果动图
  5. 训练营第四天作业 - 用盒子模型制作卡片
  6. PDF文档怎么新建空白页面的方法
  7. 【Android 逆向】x86 汇编 ( add / sub / mul / div 数值运算指令 | xor / not / sal / sar / shl / shr 位运算指令 )
  8. Java毕业设计-二手车交易平台管理系统 二手车交易管理系统 二手汽车交易系统 汽车销售系统 汽车商城
  9. 简洁表格简历模板-Word简历可编辑
  10. MySQL数据库 - 复杂查询(二)第五关