数据结构之栈

一、顺序栈

/*
Author: luuuuyang
Date: 2018/9/25
Version 1.0
Functions:
    StackExit 栈是否存在
    InitStack 初始化
    DestroyStack 销毁
    ClearStack 清空
    StackEmpty 是否为空
    StackLenth 栈长
    GetTop 取栈顶元素
    Push 进栈
    Pop 出栈
    StackTraverse 栈遍历
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
#define MAXSIZE 100
typedef int ElemType;
typedef enum{
    OVERFLOW=-1,
    ERROR=0,
    OK=1
}Status;
typedef struct{
    ElemType *base;
    ElemType *top;
    int stacksize;
}SqStack;
 
bool StackExit(SqStack S){
    return S.base?true:false;
}
Status InitStack(SqStack &S){
    S.base=new ElemType[MAXSIZE];
    if(!S.base) return ERROR;
    S.top=S.base;
    S.stacksize=MAXSIZE;
    return OK;
}
Status DestroyStack(SqStack &S){
    if(!StackExit(S)) return ERROR;
    delete S.base;
    S.base=NULL;
    S.top=NULL;
    S.stacksize=0;
    return OK;
}
Status ClearStack(SqStack &S){
    if(!StackExit(S)) return ERROR;
    S.top=S.base;
    return OK;
}
bool StackEmpty(SqStack S){//没有判定栈是否存在
    return S.base==S.top?true:false;
}
int StackLenth(SqStack S){//没有判定栈是否存在
    return S.top-S.base;
}
ElemType GetTop(SqStack S){
    if(S.top!=S.base) return *(S.top-1);
}
Status Push(SqStack &S,ElemType e){
    if(S.top-S.base==S.stacksize) return ERROR;
    *S.top++=e;
    return OK;
}
Status Pop(SqStack &S,ElemType &e){
    if(StackEmpty(S)) return ERROR;
    e=*--S.top;
    return OK;
}
void StackTraverse(SqStack S){
    ElemType *p;
    for(p=S.base;p!=S.top;p++){
        if(p+1==S.top) printf("%d\n",*p);
        else printf("%d ",*p);
    }
}
void Menu(){
    printf("输入数字选择测试函数\n");
    printf("1、进栈\n");
    printf("2、出栈\n");
    printf("3、取顶\n");
    printf("4、栈长\n");
    printf("5、栈空\n");
    printf("6、清空\n");
    printf("7、销毁\n");
    printf("8、遍历\n");
    printf("0、退出\n");
}
void BacktoMenu(){
    printf("按任意键返回菜单\n");
    getchar();
}
int main(){
    printf("按任意键创建顺序栈\n");
    getchar();
    SqStack S;
    if(InitStack(S)) printf("创建成功\n");
    else printf("创建失败\n");
    printf("按任意键进入菜单\n");
    getchar();
    while(1){
        system("cls");
        Menu();
        int op;
        ElemType e;
        scanf("%d",&op);
        getchar();
        switch(op){
            case 1:
                printf("请输入要进栈的元素\n");
                scanf("%d",&e);
                getchar();
                if(!StackExit(S)) printf("栈不存在,进栈失败\n");
                else if(Push(S,e)) printf("进栈成功\n");
                else printf("栈满,进栈失败\n");
                BacktoMenu();
                break;
            case 2:
                if(!StackExit(S)) printf("栈不存在,出栈失败\n");
                else if(Pop(S,e)) printf("出栈成功,栈顶元素为%d\n",e);
                else printf("栈空,出栈失败\n");
                BacktoMenu();
                break;
            case 3:
                if(!StackExit(S)) printf("栈不存在,取顶失败\n");
                else if(StackEmpty(S)) printf("栈空,取顶失败\n");
                else{
                    e=GetTop(S);
                    printf("取顶成功,栈顶元素为%d\n",e);
                }
                BacktoMenu();
                break;
            case 4:
                if(!StackExit(S)) printf("栈不存在,无法取得栈长\n");
                else printf("栈长为%d\n",StackLenth(S));
                BacktoMenu();
                break;
            case 5:
                if(!StackExit(S)) printf("栈不存在,无法判断栈空\n");
                else StackEmpty(S)?printf("栈空\n"):printf("栈非空\n");
                BacktoMenu();
                break;
            case 6:
                if(ClearStack(S)) printf("清空成功\n");
                else printf("栈不存在,清空失败\n");
                BacktoMenu();
                break;
            case 7:
                if(DestroyStack(S)) printf("销毁成功\n");
                else printf("栈不存在,销毁失败\n");
                BacktoMenu();
                break;
            case 8:
                if(!StackExit(S)) printf("栈不存在,无法遍历\n");
                else if(StackEmpty(S)) printf("栈空,无法遍历\n");
                else StackTraverse(S);
                BacktoMenu();
                break;
            case 0:
                exit(0);
        }
    }
    return 0;
}

二、链栈

/*
Author: luuuuyang
Date: 2018/9/25
Version 1.0
Functions:
    InitStack 初始化
    StackEmpty 栈空
    Push 入栈
    Pop 出栈
    GetTop 取顶
    ClearStack 清空
    StackLenth 栈长
    StackTraverse 遍历栈
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
typedef int ElemType;
typedef enum{
    OVERFLOW=-1,
    ERROR=0,
    OK=1
}Status;
typedef struct StackNode{
    ElemType data;
    struct StackNode *next;
}StackNode,*LinkStack;
Status InitStack(LinkStack &S){
    S=NULL;
    return OK;
}
bool StackEmpty(LinkStack S){
    return S?false:true;
}
Status Push(LinkStack &S,ElemType e){
    StackNode *p=new StackNode;
    p->data=e;
    p->next=S;
    S=p;
    return OK;
}
Status Pop(LinkStack &S,ElemType &e){
    if(StackEmpty(S)) return ERROR;
    e=S->data;
    StackNode *p=S;
    S=S->next;
    delete p;
    return OK;
}
ElemType GetTop(LinkStack S){
    return S->data;
}
Status ClearStack(LinkStack &S){
    StackNode *p=S;
    while(p){
        S=S->next;
        delete p;
        p=S;
    }
    return OK;
}
int StackLenth(LinkStack S){
    int lenth=0;
    StackNode *p=S;
    while(p){
        S=S->next;
        lenth++;
        p=S;
    }
    return lenth;
}
void StackTraverse(LinkStack S){
    if(StackEmpty(S)) printf("栈空,遍历失败\n");
    for(StackNode *p=S;p!=NULL;p=p->next){
        if(p->next==NULL) printf("%d\n",p->data);
        else printf("%d ",p->data);
    }
}
void Menu(){
    printf("输入数字选择测试函数\n");
    printf("1、进栈\n");
    printf("2、出栈\n");
    printf("3、取顶\n");
    printf("4、栈长\n");
    printf("5、栈空\n");
    printf("6、清空\n");
    printf("7、遍历\n");
    printf("0、退出\n");
}
void BacktoMenu(){
    printf("按任意键返回菜单\n");
    getchar();
}
int main(){
    printf("按任意键创建链栈\n");
    getchar();
    LinkStack S;
    if(InitStack(S)) printf("创建成功\n");
    else printf("创建失败\n");
    printf("按任意键进入菜单\n");
    getchar();
    while(1){
        system("cls");
        Menu();
        int op;
        ElemType e;
        scanf("%d",&op);
        getchar();
        switch(op){
            case 1:
                printf("请输入要进栈的元素\n");
                scanf("%d",&e);
                getchar();
                Push(S,e);
                printf("进栈成功\n");
                BacktoMenu();
                break;
            case 2:
                if(Pop(S,e)) printf("出栈成功,栈顶元素为%d\n",e);
                else printf("栈空,出栈失败\n");
                BacktoMenu();
                break;
            case 3:
                if(StackEmpty(S)) printf("栈空,取顶失败\n");
                else{
                    e=GetTop(S);
                    printf("取顶成功,栈顶元素为%d\n",e);
                }
                BacktoMenu();
                break;
            case 4:
                printf("栈长为%d\n",StackLenth(S));
                BacktoMenu();
                break;
            case 5:
                StackEmpty(S)?printf("栈空\n"):printf("栈非空\n");
                BacktoMenu();
                break;
            case 6:
                if(ClearStack(S)) printf("清空成功\n");
                BacktoMenu();
                break;
            case 7:
                StackTraverse(S);
                BacktoMenu();
                break;
            case 0:
                exit(0);
        }
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值