数据结构--基于天勤--顺序栈

/*

顺序栈(数组实现)
2018.12.09

*/
#include<stdio.h>
#include<string.h>
#define MAXSIZE 10000

//顺序栈结构体定义:数据+栈顶
typedef struct
{
    int data[MAXSIZE];
    int top;
}SequenceStack; 
//初始化顺序栈 top = -1
void initStack(SequenceStack *s)
{
    s->top = -1;
}

//顺序栈判空
int isEmpty(SequenceStack s)
{
    if (s.top == -1)return 1;
    return 0;
}
//顺序栈入栈
void push(SequenceStack *s,int element)
{
    if (s->top == MAXSIZE - 1)return 0;

    (s->top)++;          //此处非考试标准写法
    s->data[s->top] = element;
}

//顺序栈出栈
int pop(SequenceStack *s)
{
    if (s->top == -1)return 0;

    int popElement;
    popElement = s->data[s->top];
    (s->top)--;
    return popElement;
}
//打印顺序栈
void printStack(SequenceStack s)
{
    printf("从栈底到栈顶的元素为:");

    for (int i = 0; i <= s.top; i++)
    {
        printf("%d ", s.data[i]);
    }
    printf("\n");
}
//顺序栈应用:字符串匹配
int isBracketMatch(char *str, int strLength)
{
    /*判断相等用 == 注意此处是 字符串-字符数组*/
    /*【考试用】下面两句快速定义与初始化 顺序栈   考研考的多的是顺序栈*/
    char stack[MAXSIZE];
    int top = -1;     //用两个语句完成 栈的定义与初始化

    for (int i = 0; i < strLength; i++)
    {
        if (str[i] == '(')stack[++top] = '('; //入栈
        if (str[i] == ')')
        {
            if (top == -1)return 0;//第一个出现 )肯定是错误的表达式,一定不匹配
            else top--;
        }
    }

    if (top == -1)return 1;  //都找完,栈空,说明匹配
    else return 0;    //都找完,栈不空,说明不匹配
    
}
//顺序栈应用:进制转换
void decimialToBinary(int decimalNumber)
{
    int stack[MAXSIZE];  //定义栈
    int top = -1;

    while (decimalNumber)
    {
        stack[++top] = decimalNumber % 2; //入栈
        decimalNumber /= 2;
    }
    int temp;

    printf("转换为二进制数:");
    while (top != -1)
    {
        temp = stack[top--]; //出栈
        printf("%d", temp);
    }

}
int main()
{
    //顺序栈--括号匹配
    {
    char str[MAXSIZE];
    printf("\n顺序栈 字符串括号匹配\n");
    printf("请输入 字符串:");
    gets(str);
    int strLength = strlen(str);
    printf("字符串的长度为:%d\n", strLength);

    if (isBracketMatch(str, strLength) == 1)printf("字符串中“()”匹配\n");
    else printf("字符串中“()”不匹配\n");
    }

    //栈的基本操作--出入栈、栈判空
    {
        int num;
        printf("请输入 入栈元素的个数:");
        scanf("%d", &num);

        SequenceStack s;
        initStack(&s);  //初始化栈
        int element;
        printf("请输入 入栈元素(空格隔开):");
        for (int i = 0; i < num; i++)
        {
            scanf("%d", &element);
            push(&s, element);  //入栈
        }
        printStack(s);

        printf("依次出栈\n");
        int popElement;
        for (int i = 1; i < num + 1; i++)
        {
            popElement = pop(&s);
            printf("第 %d 个出栈的元素为:%d\n", i, popElement);
        }

        if (isEmpty(s))printf("此时栈空");
        else printf("此时栈非空");
    }

    //顺序栈-进制转换
    {
        int decimalNumber;
        printf("请输入一个十进制数:");
        scanf("%d", &decimalNumber);
        decimialToBinary(decimalNumber);
    }

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值