代码--栈

这个程序实现了C语言栈的基本操作,包括初始化、入栈、出栈、查看栈顶元素、清空栈、判断栈是否为空,以及一些实际应用如进制转换、回文判断和括号匹配。用户可以选择不同的功能进行交互操作,展示了栈在解决实际问题中的应用。
摘要由CSDN通过智能技术生成
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
    int *base;
    int *top;
    int size;
} stack;

void initstack(stack *s)//初始化栈
{
    int n;
    printf("请输入你要创建的栈大小:");
    scanf("%d",&n);
    s->base = (int *)malloc(n*sizeof(int));
    s->top = s->base;
    s->size = n;
    printf("创建成功!\n");
}
void MenuList()
{
    printf("\n\n**************************\n");
    printf("  1  -------  初始化栈\n");
    printf("  2  -------  生成栈La\n");
    printf("  3  -------  打印栈顶元素\n");
    printf("  4  -------  入栈 \n");
    printf("  5  ------- 出栈 \n");
    printf("  6  ------- 数制转换 \n");
    printf("  7  ------- 判断回文 \n");
    printf("  8  ------- 括号匹配 \n");
    printf("**************************\n");
}
 int push(stack *s,int i)//入栈
{	if(s->top-s->base==s->size)
        return 0;
    *s->top = i;
    s->top++;
    return 1;
}

int pushc(stack *s,char c)//入栈
{	if(s->top-s->base==s->size)
        return 0;
    *s->top = c;
    s->top++;//始终指向栈顶元素的下一位置
    return 1;
}
int pop(stack *s)//出栈
{
    int e;
    if(s->top!=s->base){
        s->top--;
        e=*(s->top);
        return e;
    }
    else
        return 0;

}
char popc(stack *s)//出栈
{
    char c;
    if(s->top!=s->base){
        s->top--;
        c=*(s->top);
        return c;
    }
    else
        return '0';
}
int gettop(stack *s)//获取栈顶元素
{
    int e;
    if(s->top==s->base)
        return 0;  //栈空
    e=*(s->top-1);  //栈非空,将栈顶元素送往e单元保存,栈s保持不变
    return e;
}

void empty(stack *s)//清空栈
{
    s->top==s->base;
}
int stackempty(stack *s)//判空
        {
            if ( s->top==s->base )        /* 栈空 */
                return 1;
            return  0;
        }
void Decimal_Binary () {//进制转换
    int N, r;
    stack S;  //定义栈结构S
    initstack(&S);    //初始化栈S
    printf("请输入要转换的数:");
    scanf("%d", &N);  //输入十进制正整数
    printf("请输入要转换的进制:");
    scanf("%d", &r);  //输入 正整数r (进制)
    while (N > 0) {
        push(&S, N % r);     //余数入栈
        N /= r; //被除数除以r,得到新的被除数
    }
    printf("转换后的结果为:");
    while (!stackempty(&S))
    {
        //依次从栈中弹出每一个余数,并输出之

        N=pop(&S);
        printf("%d", N);
    }
}
int huiwen() {//判断回文
    stack L;
    int s_length;
    initstack(&L);
    char s[20];
    char c1, c2;
    printf("请输入想要判断的字符串:");
    scanf("%s", &s);
    s_length = strlen(s);          //取得要判断的字符串长度
    //printf("%d",s_length);
    //进栈操作
    for (int k = 1; k <= s_length / 2; k++) {
        push(&L, s[k - 1]);
    }
    if (s_length % 2 == 0)              //判断字符串长度是奇数还是偶数
    {
        for (int i = 1; i <= s_length / 2; i++) {
            c1 = pop(&L);
            c2 = s[s_length / 2 + i - 1];
            if (c1 == c2)                         //进行判断
            {
                continue;
            } else {
                printf("Wrong!");
                return 0;
            }
        }
        printf("Right!");
    } else {
        for (int j = 1; j <= s_length / 2; j++) {
            c1 = pop(&L);
            c2 = s[s_length / 2 + j];
            if (c1 == c2)//进行判断
            {
                continue;
            } else {
                printf("Wrong!");
                return 0;
            }
        }
        printf("Right!");
    }
}

int Check( )//括号匹配
{  stack S;        //定义栈结构S
    char ch;
    initstack(&S);      //初始化栈S
    printf("请输入一串字符:");
    getchar();
    ch=getchar();
    while (ch!='\n') {
//以字符序列的形式输入表达式
        if (ch == '(' || ch == '[' || ch == '{')
            pushc(&S, ch); //遇左括号入栈
//下面是遇右括号的情况(三种)
        else if (ch == ')')
            if (stackempty(&S))
                return 0;
            else {
                ch = popc(&S);
                if (ch != '(')
                    return 0;
            }
        else if (ch == ']')
            if (stackempty(&S))
                return 0;
            else {
                ch = popc(&S);
                if (ch != '[')
                    return 0;
            }
        else if (ch == '}')
            if (stackempty(&S))
                return 0;
            else {
                ch = popc(&S);
                if (ch != '{')
                    return 0;
            }
        else if(ch != '(' || ch != '[' || ch != '{')
            return 0;
        else
            continue;
        ch = getchar();
    }
        if ( stackempty(&S) )
            return 1;
        else
            return 0;
    }

int main()
{
    stack s;
    int  i=100,x,m,j,a;
    while(i!=0) {
        MenuList();
        printf("请输入选择:");
        scanf("%d", &i);
        if (i == 1)
            initstack(&s);
        if (i == 2) {
            printf("请输入栈中元素个数:");
            scanf("%d", &m);
            for(j = 0; j < m;j++) {
                printf("请输入入栈元素值(整数):");
                scanf("%d",&x);
                a = push(&s, x);
                if (a == 0) {
                    printf("栈已满\n");
                    break;
                }
            }
        }

        if (i == 3) {
            a = gettop(&s);
            printf("%d\n", a);
        }

        if (i == 4) {
            printf("请输入入栈元素值(整数):");
            scanf("%d", &x);
            push(&s, x);
        }

        if (i == 5) {
            printf("出栈的顺序是:");
            while (s.top != s.base) {
                a = pop(&s);
                printf("%d ", a);
            }
            printf("\n");
        }
        if(i==6){
            Decimal_Binary ();
        }
        if(i==7)
            huiwen();
        if(i==8){
            a=Check( );
            if(a==1)
                printf("匹配成功!");
                else
                    printf("匹配失败!");

        }

    }
    }






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的锦鲤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值