您好!本人正在学习数据结构,非常苦恼!觉得很难!您是否可以帮我解释一下以下代码的意思!将不胜感激!
#include<stdio.h>#include<malloc.h>#include<stdlib.h>#defineSTACK_INIT_SIZE100/*储存空间初...
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100/*储存空间初始分配量*/
#define STACKINCREMENT 10/*存储空间分配增量*/
#define OK 1
#define OVERFLOW -1
#define ERROR 0
typedef struct{
int *base;
int *top;
int stacksize;
}sqstack;
int initstack(sqstack *s)/*初始化*/
{
s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return OK;
}
int pop(sqstack *s)/*出栈*/
{
if(s->top==s->base)
return ERROR;/*若栈为空,则提示出错*/
s->top--;
return 1;
}
void push(sqstack *s,char e)/*入栈*/
{
if(s->top-s->base>=s->stacksize)/*判断栈是否满*/
{s->base=(int*)realloc(s->base,(s-> stacksize+STACKINCREMENT)*sizeof(int));
if (!s->base)
exit(OVERFLOW);/*存储分配失败*/
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*(s->top++)=e;
}
char gettop(sqstack *s,char e)/*取栈顶元素 */
{
if(s->top==s->base)
return ERROR;
e=*(s->top-1);
return e;
}
main()
{
sqstack s;
int i;
char e;
initstack(&s);
// clrscr();
system("cls") ;
char x[10];
for(i=0;i<10;i++)
scanf("%c",&x[i]);
for(i=0;i<10;i++)
{
printf("%c",x[i]);/*向屏幕输出被读出的字符*/
switch(x[i])/*对读到的各种括号分情况处理*/
{
case'{':
case'[':
case'(':
push(&s,x[i]);/*出现以上三种情况则进栈*/
break;
case'}':
gettop(&s,e);
if(e=='{')
pop(&s);/*栈顶的左花括号出栈*/
else return 0;
break;
case']':
gettop(&s,e);
if(e=='[')
pop(&s);/*栈顶的中花括号出栈*/
else return 0;
break;
case')':
gettop(&s,e);
if(e=='(')
pop(&s);/*栈顶的圆花括号出栈*/
else return 0;
break;
}
}
if(s.top==s.base)/*栈最后为空时返回1,否则返回0*/
printf("OK");
else
printf("ERROR");
}
特别是main函数这段!谢谢了! 展开
#include <malloc.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100/*储存空间初始分配量*/
#define STACKINCREMENT 10/*存储空间分配增量*/
#define OK 1
#define OVERFLOW -1
#define ERROR 0
typedef struct{
int *base;
int *top;
int stacksize;
}sqstack;
int initstack(sqstack *s)/*初始化*/
{
s->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
return OK;
}
int pop(sqstack *s)/*出栈*/
{
if(s->top==s->base)
return ERROR;/*若栈为空,则提示出错*/
s->top--;
return 1;
}
void push(sqstack *s,char e)/*入栈*/
{
if(s->top-s->base>=s->stacksize)/*判断栈是否满*/
{s->base=(int*)realloc(s->base,(s-> stacksize+STACKINCREMENT)*sizeof(int));
if (!s->base)
exit(OVERFLOW);/*存储分配失败*/
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*(s->top++)=e;
}
char gettop(sqstack *s,char e)/*取栈顶元素 */
{
if(s->top==s->base)
return ERROR;
e=*(s->top-1);
return e;
}
main()
{
sqstack s;
int i;
char e;
initstack(&s);
// clrscr();
system("cls") ;
char x[10];
for(i=0;i<10;i++)
scanf("%c",&x[i]);
for(i=0;i<10;i++)
{
printf("%c",x[i]);/*向屏幕输出被读出的字符*/
switch(x[i])/*对读到的各种括号分情况处理*/
{
case'{':
case'[':
case'(':
push(&s,x[i]);/*出现以上三种情况则进栈*/
break;
case'}':
gettop(&s,e);
if(e=='{')
pop(&s);/*栈顶的左花括号出栈*/
else return 0;
break;
case']':
gettop(&s,e);
if(e=='[')
pop(&s);/*栈顶的中花括号出栈*/
else return 0;
break;
case')':
gettop(&s,e);
if(e=='(')
pop(&s);/*栈顶的圆花括号出栈*/
else return 0;
break;
}
}
if(s.top==s.base)/*栈最后为空时返回1,否则返回0*/
printf("OK");
else
printf("ERROR");
}
特别是main函数这段!谢谢了! 展开
4个回答
展开全部
这个算法很简单,这是一个判断括号(大:{},中[],小())是否匹配的操作。也就是判断括号嵌套是否正确。
如{[()]} 是正确的。
而{[}]()是不正确的。
也就是左括号出现后,同类型的右括号也要成对出现才行。
分析代码如下:
1,程序是以栈的方式来实现的,先进后出。主函数main上面的栈的操作:初始化、入栈、出栈、取栈顶元素,这个很明白了,不解释。
2,主程序中,先读取10个字符到 x中,然后循环对元素进行出入栈比较。
a,入栈:对于左括号,无条件入栈,对应代码:
case'{':
case'[':
case'(':
push(&s,x[i]);/*出现以上三种情况则进栈*/
break;
b,出栈:遇到右括号,先判断栈的最上面的元素和当前的字符是否匹配。以下代码是大括号的判断,其它两种,操作方式一样。
case'}': /*当前字符*
gettop(&s,e); /*取栈顶元素到e中*/
if(e=='{') /*进行匹配*/
pop(&s); /*如一致,则出栈*/
else return 0; /*否则,退出程序*/
break;
c,继续其它字符的比较。
d,如果10个字比较结束,并且栈表为空,则匹配成功。输出OK。
主函数更改为如下比较合理一些:
void main()
{
sqstack s;
int i;
char e;
initstack(&s);
// clrscr();
system("cls") ;
char x[10];
for(i=0;i<10;i++)
scanf("%c",&x[i]);
for(i=0;i<10;i++)
{
printf("%c",x[i]);/*向屏幕输出被读出的字符*/
switch(x[i])/*对读到的各种括号分情况处理*/
{
case'{':
case'[':
case'(':
push(&s,x[i]);/*出现以上三种情况则进栈*/
break;
case'}':
gettop(&s,e);
if(e=='{')
pop(&s);/*栈顶的左花括号出栈*/
//else return 0;
break;
case']':
gettop(&s,e);
if(e=='[')
pop(&s);/*栈顶的中花括号出栈*/
//else return 0;
break;
case')':
gettop(&s,e);
if(e=='(')
pop(&s);/*栈顶的圆花括号出栈*/
//else return 0;
break;
}
}
if(s.top==s.base)/*栈最后为空时返回1,否则返回0*/
printf("OK");
else
printf("ERROR");
}
如{[()]} 是正确的。
而{[}]()是不正确的。
也就是左括号出现后,同类型的右括号也要成对出现才行。
分析代码如下:
1,程序是以栈的方式来实现的,先进后出。主函数main上面的栈的操作:初始化、入栈、出栈、取栈顶元素,这个很明白了,不解释。
2,主程序中,先读取10个字符到 x中,然后循环对元素进行出入栈比较。
a,入栈:对于左括号,无条件入栈,对应代码:
case'{':
case'[':
case'(':
push(&s,x[i]);/*出现以上三种情况则进栈*/
break;
b,出栈:遇到右括号,先判断栈的最上面的元素和当前的字符是否匹配。以下代码是大括号的判断,其它两种,操作方式一样。
case'}': /*当前字符*
gettop(&s,e); /*取栈顶元素到e中*/
if(e=='{') /*进行匹配*/
pop(&s); /*如一致,则出栈*/
else return 0; /*否则,退出程序*/
break;
c,继续其它字符的比较。
d,如果10个字比较结束,并且栈表为空,则匹配成功。输出OK。
主函数更改为如下比较合理一些:
void main()
{
sqstack s;
int i;
char e;
initstack(&s);
// clrscr();
system("cls") ;
char x[10];
for(i=0;i<10;i++)
scanf("%c",&x[i]);
for(i=0;i<10;i++)
{
printf("%c",x[i]);/*向屏幕输出被读出的字符*/
switch(x[i])/*对读到的各种括号分情况处理*/
{
case'{':
case'[':
case'(':
push(&s,x[i]);/*出现以上三种情况则进栈*/
break;
case'}':
gettop(&s,e);
if(e=='{')
pop(&s);/*栈顶的左花括号出栈*/
//else return 0;
break;
case']':
gettop(&s,e);
if(e=='[')
pop(&s);/*栈顶的中花括号出栈*/
//else return 0;
break;
case')':
gettop(&s,e);
if(e=='(')
pop(&s);/*栈顶的圆花括号出栈*/
//else return 0;
break;
}
}
if(s.top==s.base)/*栈最后为空时返回1,否则返回0*/
printf("OK");
else
printf("ERROR");
}
更多追问追答
追问
太感谢!现在我明白了!看回答就知道您是个高手,不知道您是否可以给小弟我一些建议或是推荐一些好的参考资料!谢谢啦!
追答
数据结构方面的书籍都会对算法,常用的应用有较详细的解释和说明。
先学好数据结构,然后才是算法。
参考(C语言):
数据结构与算法分析—C语言描述(Mark Allen weiss Second Edition)
[数据结构题集(C语言版)].严蔚敏_吴伟民
[数据结构(C语言版)].清华大学_严蔚敏
数据结构——使用C语言(第4版)[朱战立]
算法与数据结构—C语言描述-张乃孝
算法设计与分析(王晓东)
来自:求助得到的回答
展开全部
那只是说明你还不用心,你偷懒你不想干,如果你为了生存而去学习,你会什么都会学会的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
还是看书吧,真的,代码看不懂的话,别人给你讲,你也不一定能看懂!真的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询