栈的问题~~~谢谢了

ogiso_pest 2008-10-01 07:41:43
我输入B(exig)B只有最后一个元素进栈了!
显示输出!
请问这是什么原因啊?
谢谢了


#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<conio.h>
#define TRUE 1
#define FALSE 0


typedef struct node
{
char s;
struct node *next;
}StackNode,*StackList;

typedef struct Node
{
char q;
struct Node *next;
}QueueNode;

typedef struct
{
QueueNode *front;
QueueNode *rear;
}QueueList;

void InitStack(StackList S)
{
S=(StackList)malloc(sizeof(StackNode));
S->next=NULL;
}

int InitQueue(QueueList *Q)
{
Q->front=(QueueNode*)malloc(sizeof(QueueNode));
if(Q->front==NULL)
{
Q->rear=Q->front;
Q->front->next=NULL;
return TRUE;
}
else
return FALSE;
}

void TransCharater(char ch)
{
switch(ch)
{
case 't':
printf("\n天");
break;
case 'd':
printf("地");
break;
case 's':
printf("上");
break;
case 'a':
printf("一只");
break;
case 'e':
printf("鹅");
break;
case 'z':
printf("追");
break;
case 'g':
printf("赶");
break;
case 'x':
printf("下");
break;
case 'n':
printf("蛋");
break;
case 'h':
printf("恨");
break;
default:
break;
}
}

int Push(StackList S,char ch)
{
StackNode *p;

p=(StackList)malloc(sizeof(StackNode));
if(p=NULL)
return FALSE;
else
{
p->s=ch;
p->next=S->next;
S->next=p;
return TRUE;
}
}

int Pop(StackList S,char *c)
{
StackNode *p;
p=S->next;
if(p==NULL)
return FALSE;
*c=p->s;
S->next=p->next;
free(p);
return TRUE;
}

int EnterQueue(QueueList *Q,char c)
{
QueueNode *q;
q=(QueueNode *)malloc(sizeof(QueueNode));
if(q==NULL)
return FALSE;
q->q=c;
q->next=NULL;
Q->rear->next=q;
Q->rear=q;
return TRUE;
}

int DeleteQueue(QueueList *Q,char *c)
{
QueueNode *p;
if(Q->front==Q->rear)
return FALSE;
p=Q->front->next;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
*c=p->q;
free(p);
return TRUE;
}

void PrintStack(StackList S)
{
StackNode *p;
p=S->next;
printf("~~~");
while(p)
{
printf("%c ",p->s);
p=p->next;
}
printf("\n");

}

void PrintQueue(QueueList *Q)
{
QueueNode *q;
q=Q->front->next;
while(q!=Q->rear)
{
printf("%c ",q->q);
q=q->next;
}
printf("\n");
}

void DevilTrans(StackList S)
{
char c,c1,devil[50],trans[50],*p;
int i=0,j,k=0;
QueueNode *q;
QueueList Q;
printf("请输入魔王语言:\n");


while((c=getchar())!='\n')
{
devil[i]=c;
i++;
}
devil[i]='\0';

for(j=i-1;j>0;j--)
{
printf("%c",devil[j]);
Push(S,devil[j]);
}
printf("入栈后魔王的话为:\n");
PrintStack(S);

while(S->next)
{
Pop(S,&c);
if(c=='(')
break;
}
while(c!=')')
{
Pop(S,&c);
EnterQueue(&Q,c);
}

q=Q.front;
while(q->next!=Q.rear)
q=q->next;
Q.rear=q;


printf("入队后的元素是:\n");
PrintQueue(&Q);
printf("出栈后剩下的元素是:\n");
PrintStack(S);

while(Q.front!=Q.rear)
{
DeleteQueue(&Q,&c);
if(k==0)
{
Push(S,c);
c1=c;
}
if(k>0)
{
Push(S,c);
Push(S,c1);
}
k++;
}

for(k=0;k<i;k++)
{
if(devil[k]=='(')
break;
Push(S,devil[k]);
}

printf("队列里的元素按照对则入栈后为:\n");
PrintStack(S);

while(S->next!=NULL)
{
k=0;
Pop(S,&c);
if(c=='B')
strcat(trans,"tsaedsae");
else if(c=='A')
strcat(trans,"sae");
else
strcat(trans,&c);
}

printf("将魔王语言转换成人类的字母语言为:\n");
p=trans;
while(*p!='\0')
{
printf("%c ",*p);
p++;
}

p=trans;
printf("转换成人类可以理解的语言为:\n");
while(*p!='\0')
{
TransCharater(*p);
p++;
}

}

int main()
{
StackList S;
InitStack(S);
DevilTrans(S);
return 0;
}
...全文
81 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hmsuccess 2008-10-01
  • 打赏
  • 举报
回复
还有就是内存泄露很严重
kkndciapp 2008-10-01
  • 打赏
  • 举报
回复
你把题目意思说下吧
前面这里错了
void InitStack(StackList *S) 
{
*S=(StackList)malloc(sizeof(StackNode));
(*S)->next=NULL;
}
hmsuccess 2008-10-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 k2eats 的回复:]
只有最好一个元素进栈,因为后面的元素覆盖了前面的
[/Quote]
那是由于lz的程序(PUSH)中的
if(p=NULL)
有错
hmsuccess 2008-10-01
  • 打赏
  • 举报
回复
修改其中

void InitStack(StackList *S)
{
StackList temp;

temp=(StackNode *)malloc(sizeof(StackNode));

if(temp==NULL)
return;
temp->s = 0;
temp->next=NULL;
*S= temp;

}
Jacky_Dai 2008-10-01
  • 打赏
  • 举报
回复
栈顶指针移动有问题吗?
K行天下 2008-10-01
  • 打赏
  • 举报
回复
只有最好一个元素进栈,因为后面的元素覆盖了前面的
机智的呆呆 2008-10-01
  • 打赏
  • 举报
回复
StackList S;
InitStack(S);
没有给S这个指针变量正确赋值,InitStack()参数应该是个二级指针才行

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧