顺序栈的基础操作

顺序栈的几个基础操作

/* ************************
1、定义一个顺序栈,输入测试数据, 分别根据其中的命令字符来处理堆栈;
(1)对所有的’P’操作,如果栈满输出’F’,否则完成压栈操作;
(2)对所有的’A’操作,如果栈空,则输出’E’,否则输出当时栈顶的值;
(3)对所有的’O’操作,如果栈空,则输出’E’,否则输出栈顶元素的值,并让其出栈;
*************************/

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

#define FALSE 0
#define TRUE 1
#define Stack_Size 20

typedef struct {
    char data[Stack_Size];
    int top;
} SeqStack;

//初始化
void InitStack(SeqStack *s) { s->top = -1; }
//进栈
int Push(SeqStack *s);
//出栈
int Pop(SeqStack *s);
//菜单
char meau();
//刷新缓存区
void empty();

//主函数
int main() {
    SeqStack sc;
    // SeqStack *s;

    char b, c;
    int exit = 0;

    InitStack(&sc);

    while (exit != 1) {
        b = meau();
        // b=(b>='a'&&b<='z')?(b-32):b;
        switch (toupper(b)) { // ctype.h里函数:toupper<小写转大写>、tolower<大转小>
        case 'P':
            if (Push(&sc)) {
                printf("\n---入栈成功---");
            }
            break;
        case 'A':
            if (sc.top == -1) {
                printf("---栈为空---");
            } else {
                c = sc.data[sc.top]; //  . 和 -> 的区别
                printf("\n栈顶元素为:%c", c);
            }
            break;
        case 'O':
            if (Pop(&sc))
                break;
        case 'Z':
            exit = 1;
            break;
        default:
            printf("\n---输入有误---\n");
            break;
        }
        empty();
    }
    printf("\n---成功退出---\n");
    return 0;
}

//菜单
char meau() {
    char a;
    printf("\n=========================================");
    printf("\n\n\t          菜单界面");
    printf("\n\n\t       P.进栈");
    printf("\n\n\t       A.栈顶元素");
    printf("\n\n\t       O.出栈");
    printf("\n\n\t       Z.退出");
    printf("\n\n=========================================\n");
    printf("请输入想要执行的操作:");
    scanf("%c", &a);
    empty();
    // getchar(); 为啥
    return a;
}

//进栈
int Push(SeqStack *s) {
    char x;

    printf("\n请输入进栈元素:");
    scanf("%c", &x);

    if (s->top == Stack_Size - 1) {
        printf("---栈已满---\n");
        return FALSE;
    }
    s->top++;
    s->data[s->top] = x;
    return TRUE;
}

//出栈
int Pop(SeqStack *s) {
    char *x;
    x = (char *)malloc(sizeof(char));

    if (s->top == -1) {
        printf("---无可出栈元素---");
        return FALSE;
    } else {
        *x = s->data[s->top];
        printf("出栈元素:%c", *x);
        s->top--;
        return TRUE;
    }
}

//刷新缓存区
void empty() {
    char ch;
    while ((ch = getchar()) != '\n' && ch != EOF)
        ;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值