栈的顺序.链式实现

用顺序表示的栈的实现:

#include <iostream.h>
#define OVERFLOW 0//定义“溢出”为0
#define ERROR 0
#define OK 1
#define MAXSIZE 100//顺序栈存储空间的初始分配量
 
typedef int SElemType;//SElemType为数据类型
typedef int Status;//定义结构体
 
//顺序栈的类型定义
typedef struct
{
    SElemType *base;//栈底指针
    SElemType *top;//栈顶指针
    int stacksize;//栈的最大容量
}SqStack;//SqStack就是问题中声明的类型,后续可以用它来定义变量
 
 
//栈的初始化:初始化,初始化操作就是为栈动态分配一个预定义大小的数组空间,base指向栈底,top 初始值也指向栈底,表示栈空,stacksize置为栈的最大容量
Status InitStack(SqStack &S)//栈的初始化,构造一个空栈s
{
    S.base=new SElemType[MAXSIZE];//为顺序栈分配一个最大容量为MAXSIZE 的数组空间
    if(!S.base)
        return OVERFLOW;//存储分配失败
    S.top=S.base;
    S.stacksize=MAXSIZE;
    return OK;
}
 
 
//顺序栈的入栈,入栈操作是指在栈顶插入一个新的元素,首先判断栈是否满,若满则报错,否则将新元素压入栈顶,栈顶//指针加1
Status Push(SqStack &S,SElemType e)
{
    if(S.top-S.base==S.stacksize)
        return ERROR;判断栈是否为空,为空报错
    *S.top++=e;//等价于*S.top=e;S.top++;目的是将e压入栈顶,栈顶指针加1
    return OK;
}
 
 
//顺序栈的出栈:出栈操作是将栈顶元素删除。首先判断栈是否为空,若空则报错,否则栈顶指针减1,栈顶元素出栈
Status Pop(SqStack &S,SElemType&e)
{
    if(S.top==S.base)
        return ERROR; //判断栈是否为空,为空报错
    e=*--S.top;//等价于S.top--;*S.top=e;目的是栈顶指针减1并将栈顶元素赋给e
    return OK;
}
 
 
 
 
//取顺序栈的栈顶元素
Status GetTop(SqStack S,SElemType &e)//返回s的栈顶元素,不修改栈顶指针
{
    if(S.top==S.base)
        return ERROR; //判断栈是否为空,为空报错
    e=*(S.top-1);
    return OK;
}
 
 
bool StackEmpty(SqStack S)//若s为空栈,返回true,否则返回false
{
    if(S.top==S.base)
        return true;
    else
        return false;
}
 
 
int StackLength(SqStack S)//返回s的元素个数,即栈的长度
{
    return S.top-S.base;
}
 
 
int main()
{
    SqStack s;
    int i,e;
    if(InitStack(s))
        cout<<"成功初始化栈!\n";
    for(i=0;i<5;i++)
    {
        cout<<"请输入第"<<i+1<<"个元素:";
        cin>>e;
        Push(s,e);
    }
    if(GetTop(s,e))
    {
        cout<<"\n栈顶元素为:";
        cout<<e<<"\n";
    }
    cout<<"\n弹出栈的元素依次为:";
    while(Pop(s,e))
        cout<<e<<" ";
    cout<<"\n";
    return 0;}

用链表示的栈的实现:

#include<cstdio>
#include<cstdlib> 
#define MAXSIZE 1000    //链表的最大长度 
#define SElemType int 
#define Status int 
//栈的结构
typedef struct LStack{
    SElemType data;        //数据域
    struct LStack *next;    //指针域 
}LStack,*LStackList; 
 
//初始化
Status InitStack(LStackList &S){
    S = new LStack;
    S->next = NULL;
    return 0; 
}
 
//入栈
Status Push(LStackList &S,SElemType e){    
    LStackList p = new LStack;        //生成新的结点 
    p->data = e;    //新结点的数据域赋值 
    p->next = S;    //新结点的指针域指向头结点(栈顶) 
    S=p;    //链表的表头更新为新插入的元素; 
    printf("压入栈成功\n");
    return 0; 

 
//出栈
Status Pop(LStackList &S){
    if(S->next){
        LStackList p = S;
        S=S->next;    //头指针后移 
        free(p);
        printf("出栈成功\n"); 
    }else{
        printf("栈空\n"); 
    }

 
//创建栈,就是重复的将元素入栈(当然也可以单独写一个创建的函数)
void Creat(LStackList &S,int n){
    InitStack(S);
    for(int i=0;i<n;i++){
        int e;
        scanf("%d",&e); 
        Push(S,e);
    }
    printf("创建成功\n");
}  
 
//遍历,因为是从栈顶(表头)开始的遍历,所以输出的列表是逆序的 
Status StackTraverse(LStackList S){
    printf("遍历开始:\n");
    LStackList p = S;
    /**
    注意:最后一个链表是没有元素的 
    */ 
    while(p->next){        //最后一个链表是没有元素的 
        printf("%d ",p->data);
        p = p->next;
    } 
    printf("\n"); 

 
//获取栈的元素个数 
Status StackLength(LStackList S){
    LStackList p = S;
    int count=0;
    while(p){
        p = p->next;
        count++;
    } 
    printf("栈内元素个数为:%d\n",count); 

 
//判断栈空
bool StackEmpty(LStackList S){
    if(S->next == NULL){
        printf("栈空\n");
        return true; 
    }else{
        printf("栈非空\n");
        return false;
    } 

 
//获取栈顶元素
Status GetTop(LStackList S,SElemType e){
    //判断栈空 
    if(StackEmpty(S)){
        return 0;
    }else{
        e = S->data;
        printf("栈顶元素为%d\n",e);
        return 0;
    } 

 
//栈置空
Status ClearStack(LStackList &S){
    if(S->next != NULL)
        S->next = NULL;
    printf("置空操作成功\n");
    return 0; 
}
 
//销毁链表
Status DestoryStack(LStackList &S){
    //判断是否为空表 
    LStackList p = S;
    LStackList pre = new LStack; 
    while(p->next){
        pre = p;
        p = p->next;
        delete(pre);
    } 
    printf("销毁链表成功\n");
    return 0; 

 
 
int main(){
    int n,value1,value2;
    LStackList S;
    printf("请输入元素个数:");                        
    scanf("%d",&n);
    Creat(S,n);
    StackTraverse(S);
    StackLength(S);
    GetTop(S,value1);
    Pop(S);
    StackTraverse(S);
    GetTop(S,value1);
    ClearStack(S);
    StackTraverse(S);
    DestoryStack(S);
    return 0; 

 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值