//一下是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);
你的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);
将参数改成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);
}
}
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]这个元素的地址。
修改后,y指向x所在的地址,而不是x所指向的地址。进入函数后x里装的是0x00000000,而y里装的是x的地址,0x12345678
*y的位置即为x所在的内存地址,这样就相当于把x所指向的地址从NULL改为S->elem[S->top]所在的地址位置。这样x里装的就变成了S->elem[S->top]这个元素的地址。
#6
不可以的
#7
什么不可以?函数原型不能变?如果这样的话,那你就要让x指向一个有写权限的地址块。
#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);
你的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);
将参数改成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);
}
}
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]这个元素的地址。
修改后,y指向x所在的地址,而不是x所指向的地址。进入函数后x里装的是0x00000000,而y里装的是x的地址,0x12345678
*y的位置即为x所在的内存地址,这样就相当于把x所指向的地址从NULL改为S->elem[S->top]所在的地址位置。这样x里装的就变成了S->elem[S->top]这个元素的地址。
#6
不可以的
#7
什么不可以?函数原型不能变?如果这样的话,那你就要让x指向一个有写权限的地址块。