链栈(进栈和出栈)

frankjunqi 2010-10-27 09:12:25
这个程序只能实现进栈,但是不能实现出栈,请大家帮我看看。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
typedef struct sNode
{ ElemType data;
struct sNode *next;
}Node,*N;

Node *InitStack()
{
Node *b;
b=(Node *)malloc(sizeof(Node));
b->next=NULL;
return b;
}

void Push(N a,ElemType x)
{
Node *p;
p=(Node *)malloc(sizeof(Node));
p->data=x;
p->next=a;
a=p;
}

int EmptyStack(N a)
{ if(a->next==NULL)
return 0;
else
return 1;
}

ElemType Pop(N a)
{
ElemType temp;
while(a!=NULL)
{
temp=a->data;
a=a->next;
}
return temp;
}
void main()
{
Node *a=InitStack();
ElemType x;
ElemType t; //定义栈顶指针a
/*调用初始化函数,把a置为空*/
printf("录入栈中数据:\n");
scanf("%d",&x);
while(x!=-1)
{ //假定用-1作为终止键盘输入的标志
Push(a,x); //调用进栈操作函数把x压入栈中
scanf("%d",&x); //接着输入下一个整数
}

while(EmptyStack(a)) //栈不为空时依次退栈打印出来
{
t=Pop(a);
printf("%d",t);
printf("\n");
}
}

...全文
911 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
frankjunqi 2012-08-28
  • 打赏
  • 举报
回复
谢谢各位大侠~~
著一 2012-07-30
  • 打赏
  • 举报
回复
在学习栈中,mark一下!
wzywsk 2010-10-31
  • 打赏
  • 举报
回复
楼主程序逻辑上就有错误 ,返回值应该是刚插入的元素,而且楼主未把退栈节点释放。建议楼主采用头插法建立链栈。程序可以参照4楼的。
hust_2010 2010-10-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 a305146991 的回复:]
上面的这个程序,我在VC++6.0中调试通过!
[/Quote]调试必然通过,没有语法错误,只是逻辑错误。pop函数有问题,不可能输出。a不为空的时候就往下指,把值赋给tem,循环结束,tem并不会保存所有的值,而每次赋值都是一种覆盖,最后tem就是一个空值..
hust_2010 2010-10-31
  • 打赏
  • 举报
回复
Pop函数就有问题,他只返回栈的最后一个元素,每次应该实时的出栈,Pop函数中,while循环用得不对。我没有看前人的帖子,就楼主的程序提出了自己的一点点看法。
[Quote=引用楼主 frankjunqi 的回复:]
这个程序只能实现进栈,但是不能实现出栈,请大家帮我看看。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
typedef struct sNode
{ ElemType data;
struct sNode *next;
}Node,*N;

Node *InitSt……
[/Quote]
a305146991 2010-10-28
  • 打赏
  • 举报
回复
上面的这个程序,我在VC++6.0中调试通过!
a305146991 2010-10-28
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
typedef struct sNode
{ ElemType data;
struct sNode *next;
}Node,*N;

void InitStack(N &a) //利用main()函数中已经设好的变量传进函数中,接下来几个函数都是
{
a=(Node *)malloc(sizeof(Node));
a->next=NULL;
}

void Push(N &a,ElemType x)
{
Node *p;
p=(Node *)malloc(sizeof(Node));
p->data=x;
p->next=a;
a=p;
}

int EmptyStack(N a)
{ if(a->next==NULL)
return 0;
else
return 1;
}

ElemType Pop(N &a)
{
ElemType temp;
if(a->next!=NULL) //楼主的程序主要错在这里,main()中的Pop函数调用的外部已经有了一个while循环,所以Pop函数中就没必要再来多一个while循环了!
{
temp=a->data;
a=a->next;
}
return temp;
}
void main()
{
Node *a;
InitStack(a);
ElemType x;
ElemType t; //定义栈顶指针a
/*调用初始化函数,把a置为空*/
printf("录入栈中数据:\n");
scanf("%d",&x);
while(x!=-1)
{ //假定用-1作为终止键盘输入的标志
Push(a,x); //调用进栈操作函数把x压入栈中
scanf("%d",&x); //接着输入下一个整数
}
while(EmptyStack(a)) //栈不为空时依次退栈打印出来
{
t=Pop(a);
printf("%d",t);
printf("\n");
}
}
千杯不醉-sen 2010-10-28
  • 打赏
  • 举报
回复

void push(int item)
{
Node *s=new Node;
s->data=item;
s->next=head;
head=s;
}
int pop()
{
Node *s=head;
head=head->next;
return s->data;
}
無_1024 2010-10-27
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <malloc.h>
typedef struct STACK
{
int data;
struct STACK *next;
}Stack;

//初始化
void InitStack(Stack *&s)
{

s=(Stack *)malloc(sizeof(Stack));
s->next=NULL;
}

//释放栈
void ClearStack(Stack *s)
{
Stack *p=s->next;
while(p!=NULL)
{
free(s);
s=p;
p=p->next;
}
}

//判断栈是否为空
int StackEmpty(Stack *s)
{
return(s->next==NULL);
}

int length(Stack *s)
{
int i=0;
Stack *p;
p=s->next;
while(p!=NULL)
{
i++;
p=p->next;
}
return i;
}

//得到栈顶元素
int GetTop(Stack *S,int &e)
{
if(S->next==NULL)
return 0;
e=S->next->data;
return 1;
}

//入栈
void Push(Stack *s,int e)
{
Stack *p;
p=(Stack *)malloc(sizeof(Stack));
p->data=e;
p->next=s->next;
s->next=p;

}

//出栈
int Pop(Stack *s,int &e)
{
Stack *p;
if(s->next==NULL)
{
printf("空栈...\n");
return 0;
}
p=s->next;
e=p->data;
s->next=p->next;
free(p);
return 1;
}

//输出栈的元素
void OutputStack(Stack *s)
{
Stack *p;
p=s->next;
if(s->next==NULL) {
printf("空栈...\n");
return;
}
while(p!=NULL) {
printf("%4d",p->data);
p=p->next;
}
printf("\n");
}

int main()
{
int e;
Stack *s;
printf("初始化栈:\n");
InitStack(s);
printf("依次进栈元素1,2,3,4,5\n");
Push(s,1);
Push(s,2);
Push(s,3);
Push(s,4);
Push(s,5);
printf("栈为%s\n",(StackEmpty(s)?"空":"非空"));
printf("栈的长度:%d\n",length(s));
printf("从栈顶到栈底的元素:");
OutputStack(s);
printf("出栈序列:");
while(!StackEmpty(s))
{
Pop(s,e);
printf("%d",e);
}
ClearStack(s);
system("pause");
}

千杯不醉-sen 2010-10-27
  • 打赏
  • 举报
回复
很简单啊。

#include <iostream>
using namespace std;

struct Node{
int data;
struct Node *next;
};

class Number{
public:
Number()
{
head=new Node;
}
void push(int x)
{
Node *s=new Node;
s->data = x;
if(NULL == head)
{
s->next=NULL;
head=s;
}
else
{
s->next=head;
head=s;
}
}
int pop()
{
Node *s = head;
head = s->next;
return s->data;
}
~Number()
{
delete head;
}
private:
Node *head;
};

void main( void )
{
Number data;
data.push(12);
data.push(2);
data.push(123);
data.push(152);
cout<<data.pop()<<" "<<endl;
cout<<data.pop()<<" "<<endl;
cout<<data.pop()<<" "<<endl;
cout<<data.pop()<<" "<<endl;
}
frankjunqi 2010-10-27
  • 打赏
  • 举报
回复
那你发一份可以运行的程序给我啊!
zhusizhi007 2010-10-27
  • 打赏
  • 举报
回复
程序设计整体有误,pop 时应该返回链圾的第一个,而不是最后一个,否则效率也太低了.

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧