链栈算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链栈算法相关的知识,希望对你有一定的参考价值。

要求有初始化、判空栈操作、进栈操作、出栈操作、取栈顶元素操作,还有main函数。
谢谢waynekenobi的回答 ,但是来不及查书了,暂时也没有相关书籍。谁能给出完整的代码吗?

这是我自己做的,能实现的,不过感觉有些繁琐,还没有精简,看着用吧,宏定义有些是不需要的,不过避免出错我全部写上了。
#include "iostream.h"
#include "stdio.h"
#include "malloc.h"
//#include "stdlib.h

#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define N 5
#define SElemType int
typedef int Status;

typedef struct SNode
SElemType data;
struct SNode *next;
SNode,*StackPtr;

typedef struct
StackPtr base;
StackPtr top;
SqStack;

Status InitStack(SqStack&S)
S.base=S.top=(StackPtr)malloc(sizeof(SNode));
if(!S.top)return(OVERFLOW);
S.top->next=NULL;
return OK;

Status Push(SqStack &S,SElemType e)
SNode *p;
p=(StackPtr)malloc(sizeof(SNode));
if(!p)return(OVERFLOW);
p->data=e;
p->next=NULL;
S.top->next=p;
S.top=p;
return OK;

Status Pop(SqStack &S,SElemType &e)
SNode *p;
if(S.base==S.top)
return ERROR;
p=S.base->next;//注意头结点的运用
e=p->data;
S.base->next=p->next;
if(S.top==p)S.top=S.base;
free(p);
return OK;

Status StackEmpty(SqStack S)
if(S.top==S.base)
return TURE;
else
return FALSE;


Status StackTraversee(SqStack S)
SNode *p;
p=S.base->next;
while(p<S.top)

cout<<p->data<<" ";
p=p->next;

while(p==S.top)

cout<<S.top->data<<endl;
p->next=NULL;
break;

return 0;


int main()

int i;
SElemType e;
SqStack S;
InitStack(S);
//cin>>s;

cout<<"请输入一个栈:"<<endl;
for(i=1;i<=N;i++)

cin>>e;
Push(S,e);

cout<<"输入的栈为:"<<endl;
StackTraversee(S);
Pop(S,e);
StackTraversee(S);
StackEmpty(S);
if(TURE)
cout<<"栈空."<<endl;
else if(FALSE)
cout<<"栈不空."<<endl;

return 0;
参考技术A 建议去查一下《程序员教程·数据结构·链栈》或者《数据结构及算法》一书,里面的解释极其专业。 参考技术B 你没说用C还是C++,如下是链栈的基本操作实例..以前的东西..
#include<iostream.h>
typedef
struct
stacknode
int
data;
struct
stacknode
*next;
StackNode;
typedef
struct
StackNode
*top;
//栈顶指针
LinkStack;
void
InitStack(LinkStack
*&S)
S=new
LinkStack;
S->top
=NULL;

void
InitStackn(LinkStack
*&S,int
n)
StackNode
*p;
int
e;
p=new
StackNode[n];
for(int
i=0;i<n;i++)
cin>>e;
p[i].data=e;
p[i].next=S->top;//将新结点*p插入链栈头部
S->top=&p[i];


int
StackEmpty(LinkStack
*&S)
return
S->top==NULL;

void
Push(LinkStack
*&S,int
e)//将元素e插入链栈头部
StackNode
*p;
p=new
StackNode;
p->data=e;
p->next=S->top;//将新结点*p插入链栈头部
S->top=p;

int
Pop(LinkStack
*&S)
int
e;
StackNode
*p=S->top;//保存栈顶指针
if(StackEmpty(S))
return
0;
//下溢
e=p->data;
//保存栈顶结点数据
S->top=p->next;
//将栈顶结点从链上摘下
//delete
p;
return
e;

int
StackTop(LinkStack
*&S)//取栈顶元素
if(StackEmpty(S))
return
0;
return
S->top->data;

void
print(LinkStack
*&S)
StackNode
*p=S->top;
while(p)
cout<<p->data<<'
';
p=p->next;

cout<<endl;

void
main()

int
e;
LinkStack
*S;
InitStack(S);
InitStackn(S,5);
/*for(int
i=0;i<5;i++)

cin>>e;
Push(S,e);
*/
print(S);
Pop(S);
cout<<StackTop(S);

以上是关于链栈算法的主要内容,如果未能解决你的问题,请参考以下文章

408数据结构与算法—链栈的表示和实现

栈练习之Example003-用不带头结点的单链表存储链栈并实现栈相关算法

顺序栈和链栈实现

C Language 栈和队列 - 链栈

数据结构与算法分析 - 2 - 栈ADT

Python数据结构与算法(3.1)——栈