主题:跪求高手前来指导
小弟因为数据结构课程设计遇到了问题,课程设计的题目为魔王语言的翻译,问题描述有一个魔王总是使用自己的一种非常精炼而抽象的语言讲话,没有人能听懂。但他的语言是可以逐步解释成人能懂的语言的,因为他的语言是由以下两种形式的规则由人的语言逐步抽象上去的:
(1)α→β1β2 …… βm
(2)(θδ1δ2 …… δn)→ θδnθδn-1 …… θδ1 θ
在这两种形式中,从左到右均表示解释;从右到左均表示抽象。试写一个魔王语言的解释系统,把他的话解释成人能听得懂的话。 小弟在去括号时遇到了麻烦,以下是去括号的代码,以及栈和队列的基本的操作
#include<stdio.h>
#define MAX 50
typedef struct//栈结构体
{
char e[MAX];
int top;
}SeqStack;
typedef struct NODE//队列结构体
{
char d;
struct NODE *next;
}LinkQN;
typedef struct//封装头指针为指针
{
LinkQN *front;
LinkQN *rear;
}LinkQ;
SeqStack *InitS()//初始化顺序栈
{
SeqStack *s;
s=(SeqStack *)malloc(sizeof(SeqStack));
s->top=-1;
return(s);
}
int push(SeqStack *s,char ch)//入栈
{
if(s->top==MAX-1)
return(0);
s->top++;
s->e[s->top]=ch;
return(1);
}
int pop(SeqStack *s,char *x)//出栈
{
if(s->top==-1)
return(0);
*x=s->e[s->top];
s->top--;
return(1);
}
int ISemptySt(SeqStack *s)
{
if(s->top==-1)
return 1;
return 0;
}
void InitQ(LinkQ *q)//链队列初始化
{
q->front=(LinkQN *)malloc(sizeof(LinkQN));
if(!q->front)
{
printf("分配空间失败!");
}
q->rear=q->front;
q->front->next=NULL;
}
int enter(LinkQ *q,char ch)//入队
{
LinkQN *np;
np=(LinkQN *)malloc(sizeof(LinkQN));
if(!np)
return(0);
np->d=ch;
np->next=NULL;
q->rear->next=np;
q->rear=np;
return(1);
}
int deleteq(LinkQ *q,char *c)//出队
{ LinkQN *p;
if(q->front==q->rear)
return(0);
p=q->front->next;
q->front->next=p->next;
if(q->rear==p)
q->rear=q->front;
*c=p->d;
free(p);
return(0);
}
int IsemptyQu(LinkQ *q)
{
if(q->rear==q->front)
return 1;
return 0;
}
void deletkuohao()
{
SeqStack *s1,*s2;
LinkQ *q1,*q2;
int i,count=0,t=0;//count记录“(”的个数,t记录魔王语言中字符的个数
char ch,ch1,temp;
char a[MAX];
printf("请输入魔王要说的语言:");
scanf("%s",a);
for(i=0;a[i]!='\0';i++)
{ t++;
if(a[i]==')')
count++;//
}
printf("%d%5d\t",count,t);
s1=InitS();//初始化栈s1
for(i=t;i>=0;i--)//逆序入栈
{
push(s1,a[i]);
}
while(count!=0)
{
s2=InitS();
pop(s1,&ch);
while(ch!=')')
{
push(s2,ch);
pop(s1,&ch);
}
InitQ(&q1);
pop(s2,&ch);//问题1:程序运行到此处时,不能再运行下去了,弹出一个窗口,什么引用的内存不能为read
while(ch!='(')
{
enter(&q1,ch);
temp=ch;
pop(s2,&ch);
}
InitQ(&q2);//问题2:刚开始的时候程序运行到此处才弹出那个oxccccccccccc运用的内存不能为read的那个框的,结果重装了下VC到了问题一得时候就弹出那个框
while(!IsemptyQu(&q1))
{
deleteq(&q1,&ch);
printf("%c",ch);
}
deleteq(&q2,&ch);//因为将(后的第一个字符多入了次队列
while(!IsemptyQu(&q2))
{
deleteq(&q2,&ch);
push(s2,ch);
}
while(!ISemptySt(s2))
{
pop(s2,&ch);
push(s1,ch);
}
count--;
}
while(!ISemptySt(s1))//测试下是否按照去括号法则进行
{
pop(s1,&ch);
printf("%c",ch);
}
}
小弟初学程序设计,还有很多问题不懂,希望个位大哥大姐不吝赐教,感激不尽……
来源: http://programbbs.com/bbs/view20-29904-1.htm[em2][code=c]
请填写代码
[/code][code=c]
请填写代码
[/code]