
DefaultPrj.exe 中的 0x00f215ec 处有未经处理穗大的异常: 0xC00000FD: Stack overflow
递归算法和栈都有后进先出这个性质,基本上能用递归完成的算法都可以用栈完成,都是运用后进先出这个性质的用栈之前首先你要想明白你需要使用“后进先出”干什么漏庆激,然差旁后才可编写算法,使用中往往是先把数据都压入栈中,然后使用使取出便可,
像表达式求解就是典型的运用栈的例子,可以去看看,会对栈的理解印象深刻些
# include <stdio.h>
# define origial 100
# define add 10
typedef struct
{
int *base
int *top
int stack
}opno
typedef struct
{
char *base
char *top
int stack
}optr
void initstacka(opno *a)
{
a->base=(int *)malloc(sizeof(int)*origial)
a->top=a->base
a->stack=origial
}
void initstackb(optr *b)
{
b->base=(char *)malloc(sizeof(char)*origial)
b->top=b->base
b->stack=origial
*b->top++='#'
}
void pusha(opno *a,int b)
{
if(a->top-a->base>=a->stack)
{
a->base=(int *)realloc(a->base,sizeof(int)*(a->stack+add))
a->top=a->base+a->stack
a->stack+=add
}
*a->top++=b
}
void pushb(optr *b,char c)
{
if(b->top-b->base>=b->stack)
{
b->base=(char *)realloc(b->base,sizeof(char)*(b->stack+add))
b->top=b->base+b->stack
b->stack+=add
}
*b->top++=c
}
int determine(char c)
{
if(c>='0'&&c<='9')
return(1)
else
return(0)
}
char gettopb(optr *b)
{
char a
a=*(b->top-1)
return(a)
}
char shuzu(int i,int j)
{
char a[7][7]={{'>','>','<','<','<','>','>'},{'>','>','返袜<','<','<','>','>'},{'>','>','>','>','<','>','>'},{'>','>','>','>','<','>','>'},{'<','<','<','<','<','=','0'},{'>','>','>','>','0','>','>'},{'<','<','<','<','<','0','='}}
return(a[i][j])
}
char precede(char b,char a)
{
int i,j
char s
switch(b)
{
case '+':i=0
break
case '-':i=1
break
case '*':i=2
break
case '/':i=3
break
case '(':i=4
break
case ')':i=5
break
case '#':i=6
break
}
switch(a)
{
case '+':j=0
break
case '-':j=1
break
case '*':j=2
break
case '/':j=3
break
case '(':j=4
break
case ')':j=5
break
case '#':j=6
break
}
s=shuzu(i,j)
return(s)
}
void popb(optr *a,char *b)
{
*b=*--a->top
}
void popa(opno *a,int *b)
{
*b=*--a->top
}
int count(int a,int b,char c)
{
int sum=0
switch(c)
{
case '+':sum=a+b
break
case '-':sum=a-b
break
case '*':sum=a*b
break
case '/':sum=a/b
break
}
return(sum)
}
int empty(optr *a)
{
if(a->top==a->base)
return(1)
else
return(0)
}
void main()
{
opno *a
optr *b
char c
char d[50]
int i=0,j=0,k,sum=0,p,o,r,w
int y[3]
a=(opno *)malloc(sizeof(opno))
b=(optr *)malloc(sizeof(optr))
initstacka(a)
initstackb(b)
printf("请输入表达式!\n")
scanf("%s",d)
while(d[i]!='#'&&d[i]!='\0')
if(determine(d[i]))
{
sum=0
y[j]=d[i]-'0'
while(determine(d[i+1]))
{
i=i+1
y[++j]=d[i]-'0'
}
for(k=0k<=jk++)
sum=sum*10+y[k]
if(sum!=0)
pusha(a,sum)
else
pusha(a,y[0])
j=0
for(k=0k<3k++)
y[k]=0
i=i+1
}
else
{
switch(precede(gettopb(b),d[i]))
{
case '>':popb(b,&c)
popa(a,&p)
popa(a,&o)
r=count(o,p,c)
pusha(a,r)
break
case '=':popb(b,&c)
i++
break
case '<':pushb(b,d[i])
i++
break
}
}
popb(b,&c)
while(c!='#')
{
popa(a,&o)
popa(a,&p)
r=count(o,p,c)
pusha(a,r)
popb(b,&c)
}
popa(a,&w)
printf("%d",w)
}
这就是运用栈写得表达式求值
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)