求解魔王语言
这个问题是这样的,输入一串字符,A=sae,B=tAdA,遇到括号则将括号后第一位字符作为特殊字符,在括号内所有字符后加上,输出为倒叙例:B(ehnxgz)B->tsaedsaeezegexenehetsaedsae
用的栈和队列,将数组内字符倒叙压入栈,处理后输出
但是吧我现在的输出会多输出一个(,不知道错在哪儿了改哪儿好像都是错的,求大神看看
#include<stdio.h>
#include<malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define OVERFLOW -2
typedef struct{
char *base;
char *top;
int stacksize;
}SqStack;
typedef struct QNode{
char data;
struct QNode *next;
}QNode,*Queueptr;
typedef struct{
Queueptr front1;
Queueptr rear;
}LinkQueue;
void 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;
}
void Push(SqStack &S,char e){//压入栈
if(S.top-S.base >= S.stacksize){
S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!S.base) exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++ =e;
}
void Pop(SqStack &S,char e){//弹出栈顶,并得到栈顶值
//if(S.top==S.base) return OVERFLOW;
e=*--S.top;
}
void InitQueue(LinkQueue &Q){//建立队列
Q.front1 = Q.rear = (Queueptr)malloc(sizeof(QNode));
if(!Q.front1) exit(OVERFLOW);
Q.front1->next=NULL;
}
void EnQueue(LinkQueue &Q,char e){//输入队尾
Queueptr p;
p=Q.rear;
p=(Queueptr)malloc(sizeof(QNode));
if(!p) exit(OVERFLOW);
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
void DeQueue(LinkQueue &Q,char &e){//删除队头,并获得队头值
Queueptr p;
//if(Q.front == Q.rear) return(-1);
p=Q.front1->next;
e=p->data;
Q.front1->next=p->next;
if(Q.rear==p) Q.rear=Q.front1;
free(p);
}
int main(){
SqStack S;
InitStack(S);
LinkQueue Q;
InitQueue(Q);
char secret[101],note,x;
scanf("%s",secret);
int i=0,j;
while(secret[i]!='\0'){
i++;//求出数组的长度
}
for(j=i-1;j>=0;j--){
if(secret[j]=='('){
Pop(S,x);
note=*S.top;//特殊字符
EnQueue(Q,note);
Q.front1=Q.rear;
Pop(S,x);
while(*S.top!=')'){
EnQueue(Q,*S.top);
EnQueue(Q,note);
Pop(S,x);
}
while(Q.front1!=Q.rear){
char n;
n=Q.front1->data;
Push(S,n);
Q.front1=Q.front1->next;
}
Push(S,Q.rear->data);//把最后一个字符压入
}
if(secret[j]=='A'){
Push(S,'e');
Push(S,'a');
Push(S,'s');
}
if(secret[j]=='B'){
Push(S,'e');
Push(S,'a');
Push(S,'s');
Push(S,'d');
Push(S,'e');
Push(S,'a');
Push(S,'s');
Push(S,'t');
}
else{
x=secret[j];
Push(S,x);
}
}
S.top--;
while(S.top!=S.base){
printf("%c ",*S.top);
Pop(S,x);
}
printf("%c ",*S.base);
return 0;
}