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

链栈(进栈跟出栈)

2012-08-21 
链栈(进栈和出栈)这个程序只能实现进栈,但是不能实现出栈,请大家帮我看看。#includestdio.h#includestdl

链栈(进栈和出栈)
这个程序只能实现进栈,但是不能实现出栈,请大家帮我看看。
#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");
  }
}



[解决办法]
程序设计整体有误,pop 时应该返回链圾的第一个,而不是最后一个,否则效率也太低了.
[解决办法]
很简单啊。

C/C++ code
#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;}
[解决办法]
C/C++ code
#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");} 


[解决办法]
#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");
}
}
[解决办法]
上面的这个程序,我在VC++6.0中调试通过!
[解决办法]

C/C++ code
    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;    }
[解决办法]
Pop函数就有问题,他只返回栈的最后一个元素,每次应该实时的出栈,Pop函数中,while循环用得不对。我没有看前人的帖子,就楼主的程序提出了自己的一点点看法。
探讨
这个程序只能实现进栈,但是不能实现出栈,请大家帮我看看。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;
typedef struct sNode
{ ElemType data;
struct sNode *next;
}Node,*N;

Node *InitSt……

[解决办法]
探讨
上面的这个程序,我在VC++6.0中调试通过!

[解决办法]
楼主程序逻辑上就有错误 ,返回值应该是刚插入的元素,而且楼主未把退栈节点释放。建议楼主采用头插法建立链栈。程序可以参照4楼的。

热点排行