| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1129 人关注过本帖
标题:关于堆栈的编程题
只看楼主 加入收藏
c小牛
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2007-4-21
收藏
 问题点数:0 回复次数:7 
关于堆栈的编程题

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>

typedef char elemtype;
typedef struct linknode {
elemtype data;
struct linknode *next;
}listack;
void inistack(listack *&s)
{
s=(listack *)malloc(sizeof(linknode));
s->next=NULL;
}
void clearstack(listack *&s)
{
listack *p;
p=s->next;
free(p);
s->next=NULL;
}
int stacklength(listack *s)
{
int i=0;
listack *p;
p=s;
while(p!=NULL)
{ i++;
p=p->next;
}
printf("\n它的长度是%d.\n",i-1);
}
void stackempty(listack *s)
{
if(s->next==NULL) printf("\n它是一个空栈.\n");
else printf("\n它不是一个空栈.\n");
}

void push(listack *&s)
{
listack *p;
char a;
printf("\n请输入一个字符\n");
scanf("%c",&a);getchar();
p=(listack *)malloc(sizeof(listack));
p->data=a;
p->next=s->next;
s->next=p;
}


void pop(listack *&s)
{
listack *p;
p=s->next;
if(s->next==NULL) printf("\nERROR!!!它是一个空栈.\n"); return;
printf("\n%c",p->data);
s->next=p->next;
free(p);
}
void gettop (listack *s)
{
printf("\n%c",s->next->data);
}

void disptack(listack *s)
{
listack *p;
p=s->next;
while(p!=NULL)
printf("\n%c",p->data);
}
int main(void)
{
int flag=1;
char a;
listack *s;
printf("\n---------------实验2.栈链------------------\n");
printf("你要做什么?请选择:");
printf("\n1.初始化栈链 2.判断栈链S是否为空");
printf("\n3.进栈 4.出栈 ");
printf("\n5.输出栈顶到栈底的元素 6.输出栈链长度 ");
printf("\n7.释放栈链 8.输入其它字符退出\n ");
while(flag)
{
a=getchar();getchar();
printf("\n---------------实验2.栈链------------------\n");
printf("你要做什么?请选择:");
printf("\n1.初始化栈链 2.判断栈链S是否为空");
printf("\n3.进栈 4.出栈 ");
printf("\n5.输出栈顶到栈底的元素 6.输出栈链长度 ");
printf("\n7.释放栈链 8.输入其它字符退出\n ");
switch(a)
{
case '1':inistack(s) ;break;
case '2':stackempty(s); break;
case '3':push(s);break;
case '4':pop(s);break;
case '5':disptack(s);break;
case '6':stacklength(s);break;
case '7':clearstack(s);break;
default:flag=0; break;
}
}
return 0;
}
编译连接都成功了 但是在进栈的时候 就出现问题了 看了好久也没看出是怎么回事 各位帮忙编译看看 小弟感激不尽~~~
(本人用的是dev-c++编译器)

[此贴子已经被作者于2007-6-14 21:06:29编辑过]

搜索更多相关主题的帖子: 堆栈 
2007-06-14 21:04
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
你有这几个问题需要注意:

1.要把自己的问题描述清楚,节省别人看的时间,这样你会更快的得到答案
2.注意变量和函数的命名,比如stackempty用来判断是否栈空,但你用了一个动词短语,别人不看源代码以为是清空栈,最好改名为IsStackEmpty().这些是规范问题,也是专业代码和业余的显而易见的区别.
3.界面难看,可以做一个menu()函数显示菜单,获取并返回用户选择.
4.直接说我大略看了一遍后发现的几个问题:void push(listack *&s)中*&s是什么意思?void clearstack(listack *&s)也是这样,而且这个函数释放栈链时只是释放了头节点后的第一个节点,如果后面还有节点就造成了内存泄露.

或许还有其它问题,让别人来找吧,我没耐心了
2007-06-14 22:18
c小牛
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2007-4-21
收藏
得分:0 
首先 对----------------只回感兴趣的帖子 表示感谢
1.本人觉得描述问题还不如有心人编译一遍能更节省时间
2.本人大二学生编程学的不好 不够专业 看来楼上够专业 如果楼上能给解答出来 就..... 不过我们的课本上也是这么 写的 那么以楼上看来 什么垃圾课本(数据结构(c语言版)严蔚敏 吴伟民著 清华大学出版社出版)呀 不够专业!!!!
3.本人没有学过什么界面设计 界面难看也是理所当然 还望楼上赐教
4.楼上连*&s 都不知道 看来楼上没有学过c++ 另外 “释放栈链时只是释放了头节点后的第一个节点” 我还不大清楚这样行不行 有待考证 明天我会说明答案~~~~

总之,对楼上的回答还是很感激的..........

我的爱可以化冰岛为玫瑰,那个曾经枕着蓝色风铃寂寞的叹息声入睡的你是否依然深信不疑?
2007-06-14 23:40
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 

1.我编译了你的程序,但是我还要去运行来测试.你的是运行过程中出现的问题,你应该告诉别人运行到哪一步时出现什么样的错误.

2.感觉你在讽刺我,用严蔚敏的书来压我.她的书在国内的数据结构书中的名气相当于谭浩强的c程序设计,不过我还是要说国内的书学院气太重,编书的没有工程实践经验,不重视编程风格.幸运的是教我的几个老师常做项目,重视对学生编程规范和debug技巧的培养.

3.我看你在main()函数中显示了两次菜单,如果你把显示菜单的代码写到一个menu函数中,调用两次就OK了,这样的main()函数看起来是不是更清爽呢?模块化也要好些.你这样写代码总量上千后不知道会变成什么样子.

4.不好意思,我曾经学了一点c++ ,在c论坛我看到&理解为你的误输入,我也想不出对于一个指针用引用的必要性.引用是对指针的改进,可以像传递指针那样提高函数参数传递的效率,又避免了指针可以被修改引出错误的缺点.可是你对一个4字节(vc中)的指针变量使用4字节(vc中)的引用变量,有什么意义?listack *&s换成listack * const s看起来是不是不会那么另类?
你用c++的语法却不用template class写面向对象的通用编程来做数据结构,让我想不明白,或许是引用机制让你选择了c++,不过你发到数据结构或c++版可能更合适.

5.后面其他节点没有free,所以我说会内存泄露.你对"堆"缺少了解.

2007-06-15 00:32
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
楼主喜欢用c++,下面是我学数据结构时用c++写的链栈,以前写的或许有不少错误,抛砖引玉吧:
[CODE]


//LinkStack.h
#ifndef LINKSTACK_H
#define LINKSTACK_H
template<class ValueType>
class Node
{
protected:
ValueType Value;
Node *Next;
public:
Node()
{}
~Node()
{}
void SetValue(ValueType a)
{Value=a;}
void SetNext(Node * a)
{Next=a;}
ValueType &GetValue()
{return Value; }
Node * GetNext()
{return Next;}
};

template<class ValueType>
class LinkStack
{
protected:
Node<ValueType> * Head;

public:
LinkStack();
~LinkStack();
int Pop(ValueType &);
int Push(const ValueType );
bool IsEmpty() const;
int ShowElement() const;
};

#endif

[/CODE]
2007-06-15 00:47
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
[CODE]

//LinkStack.cpp

#include "stdafx.h"
#include "LinkStack.h"

template<class ValueType>
LinkStack<ValueType>:: LinkStack()
{
Head=new Node<ValueType>;
Head->SetNext(NULL);
}

template<class ValueType>
LinkStack<ValueType>:: ~LinkStack()
{
Node<ValueType> *pNode;
if(!IsEmpty())
{
pNode=Head->GetNext();
Head->SetNext(pNode->GetNext());
delete pNode;
}
delete Head;
}


template<class ValueType>
int LinkStack<ValueType>:: Pop(ValueType &TopElement)
{
if(this->IsEmpty())
{
std::cout<<"栈已空!";
return 1;
}
else
{
Node<ValueType> *pNode;
pNode=Head->GetNext();

Head->SetNext(pNode->GetNext());
TopElement=pNode->GetValue();
delete pNode;
return 0;
}
}


template<class ValueType>
int LinkStack<ValueType>:: Push(const ValueType TopElement)
{
Node<ValueType> *pNode;
pNode=new Node<ValueType>;

pNode->SetValue(TopElement);
pNode->SetNext(Head->GetNext());
Head->SetNext(pNode);
return 0;

}


template<class ValueType>
inline bool LinkStack<ValueType>:: IsEmpty() const
{
return Head->GetNext()==NULL;
}

template<class ValueType>
int LinkStack<ValueType>:: ShowElement() const
{
if(IsEmpty())
{
std::cout<<"\n栈已空!";
return 1;
}
else
{
cout<<'\n';
Node<ValueType> *pNode,*temp;
for(pNode=Head->GetNext();pNode->GetNext()!=NULL;pNode=pNode->GetNext())
{
cout<<pNode->GetValue()<<'\t';
temp=pNode->GetNext();
pNode=temp;
}
return 0;
}
}

[/CODE]
2007-06-15 00:48
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
[CODE]

//Test_LinkStack.cpp

#include "stdafx.h"
#include "LinkStack.cpp"

int GetChoice();
using namespace std;
int main()
{
LinkStack<int> MyLinkStack;

int iChoice=0;

while(iChoice=GetChoice())
{
switch(iChoice)
{
case 1: {
if( MyLinkStack.IsEmpty())
cout<<"栈已空!\n";
else
cout<<"栈未空!\n";
break;
}
case 2: {
int a;

cout<<"你要入栈的整数是:";
cin>>a;
MyLinkStack.Push(a);
MyLinkStack.ShowElement();

break;
}
case 3: {
int a;

if(!MyLinkStack.IsEmpty())
{
MyLinkStack.Pop(a);
cout<<"你出栈的整数是:" <<a<<endl;
MyLinkStack.ShowElement();
}
else
cout<<"栈已空\n";
break;
}
default: cout<<"错误的输入\n";
}
}
return 0;
}


int GetChoice()
{
int iChoice=0;
cout<<"\n\t\t1 判栈空\n\t\t2 入栈\n\t\t3 出栈\n\t\t0 退出\n\t";
cin>>iChoice;
return iChoice;
}

[/CODE]
2007-06-15 00:49
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
在我的中缩进排版很漂亮,贴到这里就乱了,将就一下吧
2007-06-15 00:53
快速回复:关于堆栈的编程题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018160 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved