C语言数据结构大作业之魔王语言题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
pop(&s,&e) 初始条件:栈 s 已存在. 操作结果:删除 s 的栈顶元素,并以 e 返回其值.
}ADT stack
2:本程序包含四个模块:
1)主函数模块. 2)元素入栈处理模块. 3)翻译大写处理模块. 4)翻译括号内元素模块。
各模块之间调用关系: 主函数模块 {
元素入栈处理模块; 翻译模块 { 翻译括号内元素处理模块; } } 五、【我的源代码】:
} status Pop(Sqstack *S,elemtype *e)//删除栈顶元素,并用 e 返回其值; {
if(S->top==S->base) return 0; *e=*--S->top;
return *e; } status Push(Sqstack *S,elemtype e)//插入栈顶元素 {
printf("%c",e); } putchar('\n'); return 0; } 三、运行结果:
{ if(a[i]==c2) for(int j=0;j<len_b;j++) f[f_len++]=b[j]; else if(a[i]!=c2) f[f_len++]=a[i];
} printf("请输入魔王语言:\n"); gets(lan);//输入 int len_lan=strlen(lan); for(int i=len_lan-1;i>=0;i--)//将魔王语言从右往左进栈; {
c3=lan[i+1]; flag=1; } else if(e==')') { flag=0; for(int j=d_len-2;j>=0;j--)//右括号占据一个空间,所以长度减二; {
if(j) printf("%c%c",c3,d[j]); else
printf("%c",d[j]); } } else if(flag!=1)
Push(&s,lan[i]); } char e; int flag=0; int d_len=0; printf("翻译后的语言为:"); for(int i=0;i<len_lan;i++) {
Pop(&s,&e);//逐一取出栈顶元素进行处理; if(flag==1) {
d[d_len++]=e; } if(e==c1&&flag==0)printf("%s",f); else if(e==c2&&flag==0)printf("%s",b); else if(e=='('&&flag==0) {
elemtype *base; elemtype *top; 来自百度文库nt stacksize; }Sqstack; status Init(Sqstack *S)
{ S->base=(elemtype *)malloc(STACK_INIT_SIZE*sizeof(elemtype)); if(!S->base) exit (OVERFLOW); S->top=S->base; S->stacksize=STACK_INIT_SIZE; return OK;
C 语言数据结构课程设计之魔王语言
一、【问题描述】:
有一个魔王总是使用自己的一种非常精炼而抽象的语言讲话,没人能听得 懂,但他的语言总是可以解释成人能听得懂的语言,因为他的语言是以下两种规 则逐步抽象上去的: (1)α(1)αβ1β2…βm (2)(θδ1δ2…δn)θδnδn-1…θδ1θ 在这两种形式中,从左到右均表示解释。试写一个魔王语言折解释系统,把他的 话解释成人能听得懂的话。 基本要求:用下述两条规则实现。设大写字母表示魔王语言的词汇;小写字母表 示人的语言词汇;希腊字母表示可以用大写字母或小写字母代替的变量。魔王语 言可含人的词汇。 (1)B→tAdA (2)A→sae 二、【基本要求】:
if(S->top-S->base>=S->stacksize) {
S->base=(elemtype *)realloc(S->base,(S->stacksize+STACKINCREAMENT)*sizeof(elemtype));
if(!S->base) exit (OVERFLOW);
S->top=S->base+S->stacksize; S->stacksize+=STACKINCREAMENT; } *S->top++=e; return OK; } int main() { Sqstack s; Init(&s);//建立栈; char a[maxn],b[maxn],lan[maxn],f[maxn],d[maxn]; char c1,c2,c3; printf("请输入规则一:\n"); scanf("%c->%s",&c1,a);//printf("%c->%s\n",c1,a); getchar(); scanf("%c->%s",&c2,b);//printf("%c->%s\n",c2,b); getchar(); int len_a=strlen(a); int len_b=strlen(b); int f_len=0; for(int i=0;i<len_a;i++)
四、【程序设计的基本思想,原理和算法描述】:
(1)以一维数组 lan[ i ]表示魔王语言. (2)魔王语言由用户输入,初始保存在 lan[ i ]中. (3)魔王语言与人类语言的规则一手动输入,规则二固定在程序中. (4)实现过程: A:初始,魔王语言接收后存放在 lan[ i ]中. B:初次遍历数组,将数组中括号内的元素从左到右入栈; C:栈中栈顶元素依次出栈,依次处理栈顶元素。 D:如果栈顶元素为左括号,则 flag=1,套用规则二;若栈顶元素为右括号,则 flag=0,套用规则一。括号内元素存入数组中,再将数组逆置,套用规则一输出。
1:设定栈的抽象数据类型定义: ADT stack{
数据对象:D={ai|ai∈CharSet,i=1,2,…,n,n>=0} 数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…,n} 基本操作:
initstack (&s) 操作结果:构造一个空栈 s.
push (&s,e) 初始条件:栈 s 已存在. 操作结果:在栈 s 的栈顶插入新的栈顶元素 e.
#include<stdio.h> #include<iostream> #include<string.h> #include<stdlib.h> #include<malloc.h> #define OK 1 #define OVERFLOW -1 #define status int #define elemtype char #define STACK_INIT_SIZE 100 #define STACKINCREAMENT 10 #define maxn 10010 typedef struct {
用下列两条具体规则和上述规则形式(2)实现。设大写字母表示魔王语言, 小写字母表示人的语言词汇,希腊字母表示可以用大写字母或小写字母代替的变 量。魔王语言可包含人的词汇,
例如: (1)B→tAdA (2)A→sae
三、【选做内容】: 代换变量的数目不限,则在程序开始运行时首先读入一组第一种形式的规
则,而不是吧规则固定在程序中(第二种规则只能固定在程序中)。
相关文档
最新文档