主要代码:
/****************************************************
@title: 数据结构实验
@name: <实验3-1> 栈的链式存储结构
@object:
[实验目的]
采用链式存储结构实现栈的基本操作
[实验提示]
1. 在stack.h中实现栈的基本操作,
在链式存储结构中可是省去头结点。
2. 在dsp0301.cpp中编写适当的代码,进行测试
@include:
stack.h [*]
栈的链式实现
@usage:
请查看"TO-DO列表",根据要求完成代码
@copyright: BTC 2004, Zhuang Bo
@author: Zhuang Bo
@date: 2004
@description:
*****************************************************/
//测试链栈的主程序
int main()
{
LinkStack s;
int x;
//输入若干正整数以0结束,依次入栈,然后依次出栈并打印
InitStack(s);
printf("输入若干正整数以0结束:");
scanf("%d",&x);
while(x!=0) {
Push(s,x);
scanf("%d",&x);
}
int y;
printf("\n栈顶的元素为:%d",GetTop(s,y));
printf("\n现在栈中的元素个数:%d",StackLength(s));
Pop(s,x);
printf("\n删除成功,删除元素为:%d",x);
printf("\n现在栈中的元素个数:%d",StackLength(s));
printf("\n现在栈中的元素");
printf("\n出栈结果:");
while(!StackEmpty(s)) {
Pop(s,x);
printf("%4d",x);
}
printf("\n现在栈中的元素个数:%d",StackLength(s));
//-------------------------------------
// TODO (
//-------------------------------------
DestroyStack(s); //销毁栈
system("PAUSE");
return 0;
}
#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED
#include "ds.h" //for Status,OK ...
#ifndef ElemType
#define ElemType int /* 数据元素类型默认为 int */
#define ELEMTYPE_TAG
#endif
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
typedef LinkList LinkStack;
Status InitStack(LinkStack &S);
Status DestroyStack(LinkStack &S);
Status ClearStack(LinkStack &S);
Status StackEmpty(LinkStack S);
int StackLength(LinkStack S);
Status GetTop(LinkStack S, ElemType &e);
Status Push(LinkStack &S, ElemType e);
Status Pop(LinkStack &S, ElemType &e);
Status InitStack(LinkStack &S)
{
S=(LinkStack)malloc(sizeof(LNode));
if(!S){
exit(0);
}
S->next=NULL;
return OK;
}
Status DestroyStack(LinkStack &S)
{
LinkStack p;
while(S->next){
p=S->next;
S->next=p->next;
free(p);
}
return ERROR;
}
Status ClearStack(LinkStack &S)
{
S->next=NULL;
return OK;
}
Status StackEmpty(LinkStack S)
{
if(!S->next){
return TRUE;
}
return FALSE;
}
int StackLength(LinkStack S)
{
LinkStack p;
int j=0;
p=S;
while(p->next){
j++;
p=p->next;
}
return j;
}
Status GetTop(LinkStack S, ElemType &e)
{
if(!S){
return ERROR;
}
e=S->data;
return e;
}
Status Push(LinkStack &S, ElemType e)
{
LinkStack p=(LinkStack)malloc(sizeof(LNode));
p->data=e;
p->next=S;
S=p;
return OK;
}
Status Pop(LinkStack &S, ElemType &e)
{
LinkStack p;
if(!S){
return ERROR;
}
e=S->data;
p=S;
S=S->next;
free(p);
return OK;
}
#ifdef ELEMTYPE_TAG
#undef ElemType
#undef ELEMTYPE_TAG
#endif
#endif
演示结果: