堆栈问题..大虾们帮忙看看

时间:2020-12-26 17:42:54
//将源代码贴上来
//一下是head.h
#include<stdio.h>
#include<stdlib.h>

#define  MAX 50
#define  FALSE 0
#define  TRUE 1

typedef struct Node 
{
char elem[MAX];
int top;
}Stack;

void InitStack(Stack *S)
{
/*构造一个空栈S*/
S->top=-1;
}

int Push(Stack *S,char x)
{
if (S->top==MAX-1) return (FALSE);
S->top++;
S->elem[S->top]=x;
return  (TRUE);
}

int Pop(Stack *S,char *x)
{
/*将栈S的栈顶元素弹出,放到x所指向的存储空间中*/
if(S->top==-1)  /*S为空栈*/
return (FALSE);
else
{
*x=S->elem[S->top];
S->top--;       /*修改栈顶指针*/
return (TRUE);
}
}

int GetTop(Stack *S,char *x)
{
/*将栈S的栈顶元素弹出,放到x所指向的存储空间中
                                栈顶指针不变*/
if(S->top==-1)  /*iS为空栈*/
return (FALSE);
else
{
*x=S->elem[S->top];    
return (TRUE);
}
}


int Match(char ch,char str)
{
if (ch=='('&&str==')'||ch=='['&&str==']'||ch=='{'&&str=='}')
return (TRUE);
else 
return (FALSE);
}

int IsEmpty(Stack *S)
{
if(S->top==-1)  return (TRUE);
else  return (FALSE);
}

int  BrackMatch(char *str)
/*str[]中为输入的字符串,利用堆栈技术来检查该字符串中的括号是否匹配*/
{
Stack S;
int i;
char ch;
InitStack(&S);
for (i=0;str[i]!='\0';i++)/*对字符进行逐一扫描*/
{
switch (str[i])
{
case '(':
case '[':
case '{':
Push(&S,str[i]);
break;
case ')':
case ']':
case '}':
if (IsEmpty(&S))
{
printf("\n\n右括号多余!!:");
return -1;
}
else
{
GetTop(&S,&ch);
if(Match(ch,str[i]))
Pop(&S,&ch);
else 
{
printf("\n\n左右括号不同类:");
return -1;
}
}
}/*switch*/
}/*for*/
if(IsEmpty(&S))
{
printf("\n\n括号匹配!!");
return 1;
}
else
{
printf("\n\n左括号多余!!");
return -1;
}
}


//一下是main
#include "head.h"
//#include "Head2.h"

void InitStack(Stack *S);
int Push(Stack *S,char x);
int Pop(Stack *S,char *x);
int GetTop(Stack *S,char *x);
int Match(char ch,char str);
int  BrackMatch(char *str);


int main()
{
Stack S;
char str[30];
char Regular[3][5],Re[3];
char *x=NULL;
int i,j,k,Count=0;
gets(str);
if (BrackMatch(str))
{
}
//////////////////////////////////////////////////////////////////////////
//输入规则部分
for (i=0;i<3;i++)
{
printf("\ninput %d Regular:",i+1);
scanf("%c",&Re[i]);
printf("\n\tinput:%c->:",Re[i]);
Count++;
flushall();
gets(Regular[i]);
printf("%c",Re[i]);
    printf("%s",Regular[i]);
}
//输入规则部分
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//判断规则部分
for(k=0;k<Count;k++)
for (i=0;i<Count;i++)
for (j=0;Regular[i][j]!='\0';j++)
if(Re[k]==Regular[i][j])
{
printf("\nRegular Error!!\n\n");
exit(0);
}
//判断规则部分
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//入栈部分
    InitStack(&S);
for (i=0;str[i]!='\0';i++)
Count=i;
for (j=Count;j>=0;j--)
if(Push(&S,str[j]))
printf("\nGood");
printf("  %s",str);
printf("   %d",Count);
//入栈部分
//////////////////////////////////////////////////////////////////////////
GetTop(&S,x);
printf("%c",x);
return 0;
}

为什么我从栈里面弹出元素的时候错误

8 个解决方案

#1


char *x=NULL;
你的x没有分配空间..
char t;
char *x = &t;

另外,printf("%c",x);   ==>  printf("%c",*x);

为什么要用指针呢,直接用字符就行。
char x;
...
GetTop(&S,&x);
printf("%c",x);

#2


回过咯……

接点分……

#3


你的x指向NULL,函数里*X赋值当然会出错。
将参数改成char**应该就可以了。
int GetTop(Stack *S,char **x)
调用时GetTop(&S,&x);
 

#4


改成下面那样。

int GetTop(Stack *S,char  **x)
{
/*将栈S的栈顶元素弹出,放到x所指向的存储空间中
栈顶指针不变*/
if(S->top==-1) /*iS为空栈*/
return (FALSE);
else
{
*x= &(S->elem[S->top]);  
return (TRUE);
}
}

#5


原先的x指向NULL,函数的参数y(为了方便说明,把参数名x改为y)也指向NULL,你是无法给地址0x00000000赋值的。x和y是两个不同的变量,假定一个地址为0x12345678,另一个为0x22345678。这两个地址里装的都是NULL,0x00000000

修改后,y指向x所在的地址,而不是x所指向的地址。进入函数后x里装的是0x00000000,而y里装的是x的地址,0x12345678
*y的位置即为x所在的内存地址,这样就相当于把x所指向的地址从NULL改为S->elem[S->top]所在的地址位置。这样x里装的就变成了S->elem[S->top]这个元素的地址。

#6


引用 3 楼 luciferisnotsatan 的回复:
你的x指向NULL,函数里*X赋值当然会出错。
将参数改成char**应该就可以了。
int GetTop(Stack *S,char **x)
调用时GetTop(&amp;S,&amp;x);

不可以的

#7


什么不可以?函数原型不能变?如果这样的话,那你就要让x指向一个有写权限的地址块。

#8


该回复于2010-09-26 16:14:18被版主删除

#1


char *x=NULL;
你的x没有分配空间..
char t;
char *x = &t;

另外,printf("%c",x);   ==>  printf("%c",*x);

为什么要用指针呢,直接用字符就行。
char x;
...
GetTop(&S,&x);
printf("%c",x);

#2


回过咯……

接点分……

#3


你的x指向NULL,函数里*X赋值当然会出错。
将参数改成char**应该就可以了。
int GetTop(Stack *S,char **x)
调用时GetTop(&S,&x);
 

#4


改成下面那样。

int GetTop(Stack *S,char  **x)
{
/*将栈S的栈顶元素弹出,放到x所指向的存储空间中
栈顶指针不变*/
if(S->top==-1) /*iS为空栈*/
return (FALSE);
else
{
*x= &(S->elem[S->top]);  
return (TRUE);
}
}

#5


原先的x指向NULL,函数的参数y(为了方便说明,把参数名x改为y)也指向NULL,你是无法给地址0x00000000赋值的。x和y是两个不同的变量,假定一个地址为0x12345678,另一个为0x22345678。这两个地址里装的都是NULL,0x00000000

修改后,y指向x所在的地址,而不是x所指向的地址。进入函数后x里装的是0x00000000,而y里装的是x的地址,0x12345678
*y的位置即为x所在的内存地址,这样就相当于把x所指向的地址从NULL改为S->elem[S->top]所在的地址位置。这样x里装的就变成了S->elem[S->top]这个元素的地址。

#6


引用 3 楼 luciferisnotsatan 的回复:
你的x指向NULL,函数里*X赋值当然会出错。
将参数改成char**应该就可以了。
int GetTop(Stack *S,char **x)
调用时GetTop(&amp;S,&amp;x);

不可以的

#7


什么不可以?函数原型不能变?如果这样的话,那你就要让x指向一个有写权限的地址块。

#8


该回复于2010-09-26 16:14:18被版主删除