课程设计——魔王语言解释

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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){

相关文档
最新文档