课程设计——魔王语言解释
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
//定义全局变量
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define NULL 0
#define OVERFLOW -1
#define MAXSIZE 100
#define stack_init_size 100
#define stackincrement 10
char e;
char MoWords[MAXSIZE]; //定义数组,从系统输入要翻译的魔王语言static int length=0;
//定义链栈类型
typedef struct{
char *base; //栈底指针
char *top; //栈顶指针
int stacksize; //栈存储空间的大小
}sqstack;
//定义链队列类型
typedef struct qnode{
char data;
struct qnode *next;
}qnode,*queueptr;
typedef struct{
queueptr front; //队头指针
queueptr rear; //队尾指针
}linkqueue;
int InitStack(sqstack *s){
s->base=(char *)malloc(stack_init_size*sizeof(char));
if(!s->base)
exit (OVERFLOW);
s->top=s->base;
s->stacksize=stack_init_size;
return OK;
}//end 初始化栈
int PushStack(sqstack *s,char e){
if(s->top-s->base>=s->stacksize){
s->base=(char *) realloc(s->base,(s->stacksize+stackincrement)*sizeof(char)); //扩展栈内存连续的空间stackincrement 为新增空间大小
if(!s->base)
exit(OVERFLOW);
s->top=s->base+s->stacksize;
s->stacksize+=stackincrement;
}
*(s->top++)=e; //元素e进栈top++ 头指针后移
return OK;
}//end 入栈操作函数返回类型int
int PopStack(sqstack *s,char *e){
if(s->top==s->base)
return ERROR;
*e=*(--(s->top)); //出栈,头指针top--
return OK;
}//end 出栈操作函数返回类型int
int InitQueue(linkqueue *q){
q->front=q->rear=(queueptr)malloc(sizeof(qnode));
if(!q->front)
exit(OVERFLOW);
q->front->next=NULL;
return OK;
}//end 初始化队列
int InQueue(linkqueue *q,char e){
queueptr p;
p=(queueptr)malloc(sizeof(qnode));
if(!p)
exit(OVERFLOW);
p->data=e;
p->next=NULL;
q->rear->next=p;
q->rear=p;
return OK;
}//end 入队操作函数返回类型int
int OutQueue(linkqueue *q,char *e){
queueptr p;
if(q->front==q->rear)
return ERROR;
p=q->front->next;
*e=p->data;
q->front->next=p->next;
if(q->rear==p)
q->rear=q->front;
free(p);
return OK;
}//end 出队操作函数返回类型int
void DisStack(sqstack *s){
int i=0;char t,c;
c=MoWords[i];
for(i=0;MoWords[i]!='#';i++){
c=MoWords[i];
if(c=='('){
t=MoWords[i+1]; //取括号中的首字母
PushStack(s,t); //首字母入栈
i++; //指向首字母
do{
i++;
c=MoWords[i];
PushStack(s,c); //第一次循环将次字母入栈
PushStack(s,t);
}while(c!=')'); //直到括号中元素全部进栈
PopStack(s,&t); //将多余进栈的首字母t出栈
PopStack(s,&t);
}
}
}//end 括号内元素入栈处理函数
int LengthMW(char mw[]){
int i=0;char c;
c=mw[i];
for(i=0;c!='\0';i++){
length++;
c=mw[i];
}
length--;
return length;
}
void DisQueue(linkqueue *q,char key){
int j=0;char a[6];
switch(key){