数据结构--线性栈

对于栈的简单练习


/***********************************************************
 * Description: 对于栈的练习
 *              本次主要是栈和队列中的顺序栈的练习
 *              主要是针对王道书上的内容进行练习
 *              包括栈的初始化、判空栈、出栈、入栈、读栈顶元素等
 *              值得注意的是本次的练习 的栈底指针是从-1开始
 *              后续会给出从 0 开始的 并且会比较其中的不同之处
 * Author:qichaoqun
 * Date: 2019/08/08
 ************************************************************/
#include "stdlib.h"
#include "stdio.h"

#define MAX_SIZE 10
typedef int ElemType;
/**
 * 定义顺序栈
 */
typedef struct {
    //使用数组来模拟顺序栈
    ElemType data[MAX_SIZE];
    //定义栈顶指针
    int top;
} SqStack;

void showMenu();

bool initStack(SqStack &sqStack);

bool isEmptyStack(SqStack &sqStack);

bool pushStack(SqStack &sqStack, int value);

bool outStack(SqStack &sqStack);

int getTopValue(SqStack &sqStack);

void getValues(SqStack &sqStack);

int main() {
    bool isExit = false;
    //定义该顺序栈
    SqStack sqStack;
    while (!isExit) {
        showMenu();
        int option;
        scanf("%d", &option);
        switch (option) {
            case 1:
                //初始化顺序栈
                if (initStack(sqStack)) {
                    printf("初始化顺序栈成功\n");
                }
                break;
            case 2:
                //判断栈是否为空
                if (isEmptyStack(sqStack)) {
                    printf("该栈为空栈\n");
                } else {
                    printf("该栈不为空栈\n");
                }
                break;
            case 3:
                //进栈
                printf("请输入你要进栈的元素的值 ");
                int value;
                scanf("%d", &value);
                if (pushStack(sqStack, value)) {
                    printf("进栈成功\n");
                } else {
                    printf("进栈失败\n");
                }
                break;
            case 4:
                //出栈
                if (outStack(sqStack)) {
                    printf("出栈成功\n");
                } else {
                    printf("出栈失败\n");
                }
                break;
            case 5: {
                //获取栈顶元素
                int topValue = getTopValue(sqStack);
                if (topValue != -65535) {
                    printf("栈顶的元素为 %d\n", topValue);
                } else {
                    printf("该栈为空\n");
                }
                break;
            }
            case 6:
                //查看栈中的所有的元素
                getValues(sqStack);
                break;
            case 7:
                //退出
                isExit = true;
                break;
            default:
                printf("输入有误请重新输入");
                break;
        }
    }
    return 0;
}

/**
 * 查看栈中的所有的元素
 */
 void getValues(SqStack &sqStack){
     //定义辅助栈顶指针
     int newTop = sqStack.top;

     printf("栈中的元素为\n");
     while (newTop != -1){
         printf("%d\n",sqStack.data[newTop]);
         newTop--;
     }
 }

/**
 * 获取栈顶的元素
 * 注意 -65535 为标记的栈为空的返回值
 * 实际开发中并不能这样写
 */
int getTopValue(SqStack &sqStack) {
    if (sqStack.top != -1) {
        //栈非空,则获取栈顶的元素
        return sqStack.data[sqStack.top];
    }
    return -65535;
}

/**
 * 出栈的操作
 */
bool outStack(SqStack &sqStack) {
    if (sqStack.top == -1) {
        //栈为空则不能出栈
        return false;
    }
    //栈不为空则出栈
    int outValue = sqStack.data[sqStack.top];
    sqStack.top--;
    printf("出栈的元素为 %d", outValue);
    return true;
}

/**
 * 进栈的操作
 */
bool pushStack(SqStack &sqStack, int value) {
    if (sqStack.top < MAX_SIZE - 1) {
        //如果栈未满,则进栈
        sqStack.data[++sqStack.top] = value;
        return true;
    }
    return false;
}


/**
 * 判断栈是否为空
 */
bool isEmptyStack(SqStack &sqStack) {
    if (sqStack.top == -1) {
        return true;
    }
    return false;
}

/**
 * 初始化顺序栈
 * @param sqStack 顺序栈
 * @return 初始化是否成功
 */
bool initStack(SqStack &sqStack) {
    sqStack.top = -1;
    return true;
}

void showMenu() {
    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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值