首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请帮小弟我看一下这个入栈出栈的程序

2013-09-08 
请帮我看一下这个入栈出栈的程序下面是一个入栈出栈的程序,将字符串入栈并反序输出。请帮我解答有疑问的地

请帮我看一下这个入栈出栈的程序
下面是一个入栈出栈的程序,将字符串入栈并反序输出。请帮我解答有疑问的地方。


#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"

typedef char Item;

typedef struct stack
{
Item *top;
Item *save;
}Stack;

void CreateStack(Stack *p, int size);
void PushStack(Item item, Stack *p);
void ReverseShowStack(Item *item, Stack *p);

int main(void)
{
Stack A;
CreateStack(&A, 100);
char str[10];
char *p;
gets(str);
puts("the original string:");
puts(str);

for(p=str; *p!='\0'; p++)
{
PushStack(*p, &A);
}

for(p=str; *p!='\0'; p++)
{
ReverseShowStack(p, &A);
}
puts("in reverse order:");
puts(str);
return 0;
}

void CreateStack(Stack *p, int size)     
{

p->save= (Item *)malloc(sizeof(Item) * size);
p->top = p->save+sizeof(Item)*size;                 

/*
能否用下面的程序
p->save= (Item *)malloc(sizeof(Item));//这里就是没有乘以size.
p->top = p->save+sizeof(Item)*size;
*/
}

void PushStack(Item item, Stack *p)
{
p->top--;
*(p->top) = item;

//p->top--;     //我总觉得放到这样才是逻辑,但是结果却不是想要的结果,会有乱码出现。为什
//  要放在最上面呢?
}

void ReverseShowStack(Item *item, Stack *p)
{
(*item) = *(p->top);
(p->top)++;
}




[解决办法]
你这是什么栈?顺序栈还是链式栈?  
[解决办法]
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试是程序员必须掌握的技能之一。

[解决办法]
void CreateStack(Stack *p, int size)


{
   p->save    = (Item *)malloc(sizeof(Item) * size); 
   p->top = p->save+sizeof(Item)*size;
   /*         能否用下面的程序        
    p->save    = (Item *)malloc(sizeof(Item));//这里就是没有乘以size.
    p->top = p->save+sizeof(Item)*size;     */
}
>>>>当然不可以,不乘以size怎么能放下size个元素?
   
void PushStack(Item item, Stack *p) 
{     
    p->top--;
    *(p->top) = item;
   //    p->top--;     //我总觉得放到这样才是逻辑,但是结果却不是想要的结果,会有乱码出现。为什 //  要放在最上面呢? 

>>>对于一个长为10的栈,top初始化时指向stack[10],这是刚好越界的位置,必须先减再赋值。

热点排行