链栈(进栈和出栈)
这个程序只能实现进栈,但是不能实现出栈,请大家帮我看看。
#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循环用得不对。我没有看前人的帖子,就楼主的程序提出了自己的一点点看法。
[解决办法]
[解决办法]
楼主程序逻辑上就有错误 ,返回值应该是刚插入的元素,而且楼主未把退栈节点释放。建议楼主采用头插法建立链栈。程序可以参照4楼的。