C/C++ 链式栈

原文地址

stackLink.h

#include "stdafx.h"
#pragma once //保证头文件被编译一次
//定义函数结果状态代码  
#define TRUE        1  
#define FALSE       0  
#define OK          1  
#define ERROR       0  
#define OVERFLOW    -1  
#define UNDERFLOW   -2  
 
//定义函数返回值类型  
typedef int  Status;  
//定义链式栈的数据元素的类型  
typedef int  ElemType;
   
//定义链式栈的存储结构  
struct LNode{
 ElemType data;  //数据域
 struct LNode *next;    //指针域
};

struct LStack{  
    struct LNode    *top;       //栈顶指针   
};

//声明链式栈的基本操作  
Status  InitStack(LStack &s);  
Status  DestroyStack(LStack &s);   
Status  StackEmpty(LStack s);  
Status  StackLength(LStack s);  
Status  Push(LStack &s,ElemType e);  
Status  Pop(LStack &s,ElemType &e);  
Status  GetTop(LStack s,ElemType &e);  
Status  StackTraverse(LStack s);

stackLink.cpp

#include "stdafx.h"
#include"linkStack.h"
#include<iostream>
using namespace std;
Status  InitStack(LStack &s)
//操作结果:构造一个空栈S
{
   struct LNode *p;
   p=(LNode *)malloc(sizeof(LNode));
   if(!p){
        cout<<"严重错误:链式栈初始分配头节点失败,程序退出";  
        exit(ERROR); 
   }
   s.top=p;
   p->next=NULL;
   return OK; 
 } 
 
Status  DestroyStack(LStack &s)  
 //初始条件:栈s已存在  
 //操作结果:栈s被销毁  
{  
    struct LNode *p;
    p=s.top;
    while(p){
        s.top=p->next;
        free(p);
        p=s.top;
    }    
    return OK;  
} 
 
Status  StackEmpty(LStack s)
//初始条件:栈s已存在  
//操作结果:若栈s为空栈,则返回TRUE,否则FALSE 
{
   if(s.top->next==NULL) return TRUE;
   return FALSE;
 }
 
Status  StackLength(LStack s)
//初始条件:栈s已存在  
//操作结果:返回s的元素个数,即栈的长度
{
   int length=0;
   struct LNode *p;
   p=s.top;
   while(p->next){
   length++;
   p=p->next;
   }
   return length;
} 
 
Status Push(LStack &s,ElemType e)
//初始条件:栈s已存在  
//操作结果:插入元素e成为新的栈顶元素
{  
   struct LNode *p;
   p=(LNode *)malloc(sizeof(LNode));
   if(!p)exit(OVERFLOW);
   s.top->data=e;
   p->next=s.top;
   s.top=p;
   return OK;
}   
   
   
Status  Pop(LStack &s,ElemType &e)
 //初始条件:栈s已存在且非空  
 //操作结果:删除s的栈顶元素,并且用e返回其值 
{
    struct LNode *p;
    if(!(s.top->next))exit(UNDERFLOW);
    p=s.top;
    s.top=p->next;
    e=s.top->data;
    free(p);
    return OK; 
}

Status  GetTop(LStack s,ElemType &e)
 //初始条件:栈s已存在且非空  
//操作结果:用e返回s的栈顶元素 
{
     if(!(s.top->next))exit(ERROR);
     s.top=s.top->next;
     e=s.top->data;
     return OK;
} 
 
Status  StackTraverse(LStack s)
//从栈顶开始依次输出
{
     struct LNode *p;
     if(!(s.top->next))exit(ERROR);
     p=s.top;
     while(p->next){
     p=p->next;
     cout<<p->data<<endl;
     }
     return OK;
}

测试用例:

// dongtai.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"linkStack.h"
#include<iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	 int e;
	 struct LStack s;
	 InitStack(s);
	 Push(s,4);
	 GetTop(s,e);
	 cout<<e<<endl;
	 Push(s,5);
	 Push(s,6);
	 Push(s,7);
	 Push(s,8);
	 Push(s,9);
	 GetTop(s,e);
	 cout<<e<<endl;
	 cout<<StackLength(s)<<endl;
	 Pop(s,e);
	 Pop(s,e);
	 Pop(s,e);
	 Pop(s,e);
	 cout<<StackEmpty(s)<<endl;
	 StackTraverse(s);

	 return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值