利用栈进行数制转换和括号匹配(C语言)

数制转换:将十进制数转换为任意进制数。由数制转换的计算公式 N = (N / d) × d + N % d (其中N为想转换的十进制数,d为想转换的进制) 我们可以知道其转换后的结果是逆序输出,故可以利用栈的先进后出的特性,将每一步计算的结果依次入栈之后再出栈,得出的结果正好是转换后的数。

括号匹配:即利用栈检验输入的括号是否正确配对,包括了三种括号的匹配,即( )、[ ]、{ }。其嵌套的顺序随意,即 [ ( { } ) ] 或 { ( [ ] ) } 等为正确匹配,而如果交叉如 [ ( ] ) 或 { ( [ ) ] }等则匹配失败。
利用栈来实现其具体思想为:初始化一个栈,依次读取输入的括号,若为左括号,则将括号压入栈中;若为右括号,则取栈顶的元素,将该元素与右括号进行配对,若配对成功,则弹出该栈顶元素。继续进行下一个括号的读取与判断,若读取完输入的括号之后栈为空,则证明压入的元素已全部弹出,即全部匹配完成;若栈不为空,则匹配失败。

代码如下:
(注:进行括号匹配时将主函数中数制转换部分的代码注释掉即可)

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
typedef int ElemType;
#define STACK_INT_SIZE 100
typedef struct {
    ElemType *base;//栈底
    int top;//栈
    int stacksize;  //当前已分配的存储空间
}SeqStack;
/*栈的初始化*/
void InitStack(SeqStack *S){
    S->base=(ElemType*)malloc(STACK_INT_SIZE* sizeof(ElemType));
    if(!S->base) { exit(0);}
    S->top=-1;
    S->stacksize=STACK_INT_SIZE;
}
/*销毁栈*/
void DestroyStack(SeqStack *S){
    if(!S){
        free(S->base);
        free(S);
    }
}
/*判断栈空*/
bool isEmpty(SeqStack *S){
    return (S->top==-1);
}
/*判断栈满*/
bool isFull(SeqStack *S){
    return (S->top==S->stacksize-1);
}
/*取栈顶元素*/
ElemType GetTop(SeqStack *S){
    if(!isEmpty(S)){
        return S->base[S->top];
    }else{
        printf("stack empty,get top error...\n");
        return 0;
    }
}
/*元素入栈*/
void Push(SeqStack *S,ElemType e){
    if(!isFull(S)){
        S->top++;
        S->base[S->top]=e;
    }else{
        printf("stack full,push error...\n");
        exit(0);
    }
}
/*元素出栈*/
void Pop(SeqStack *S,ElemType *e){
    if(!isEmpty(S)){
        *e=S->base[S->top];
        S->top--;
    }else{
        printf("stack empty,pop error...\n");
    }
}
/*输出栈元素*/
void PrintStack(SeqStack *S) {
    int i;
    if (isEmpty(S)) {
        printf("empty stack\n");
    } else{
        for(i=0;i<=S->top;i++){
            printf("%c",S->base[i]);
        }
    }
    printf("\n");
}
/*数制转换*/
void conversion(int num,int r){ //将10进制的数转为r进制
    ElemType e;
    SeqStack S;
    InitStack(&S);
    while(num){
        Push(&S,num%r);
        num/=r;
    }
    while (!isEmpty(&S)){
        Pop(&S,&e);
        printf("%d",e);
    }
}
/*括号匹配*/
void BracketMatch(char str[]){
    ElemType e;
    SeqStack S;
    InitStack(&S);
    int i;
    int len=strlen(str);
    for(i=0;i<len;i++){ //对字符串中每个字符判定
        switch(str[i])
        {
            case '(':  //左括号则入栈
                Push(&S,str[i]);
                break;
            case '[':
                Push(&S,str[i]);
                break;
            case '{':
                Push(&S,str[i]);
                break;
            case ')':   //右括号则取栈顶元素与其匹配,若匹配成功则出栈
                e=GetTop(&S);
                if(e == '(')
                    Pop(&S,&e);
                break;
            case ']':
                e=GetTop(&S);
                if(e == '[')
                    Pop(&S,&e);
                break;
            case '}':
                e=GetTop(&S);
                if(e == '{')
                    Pop(&S,&e);
                break;
            default:
                break;
        }
    }
    if(isEmpty(&S))   //若栈为空,则元素已匹配完,故匹配成功
        printf("括号匹配成功\n");
    else
        printf("括号匹配失败\n");
}

int main(){  //注:使用括号匹配时将数制转换部分代码注释掉
    /*数制转换*/
    int num,r;
    printf("输入想转换的十进制数:");
    scanf("%d",&num);
    printf("输入想转换成的进制数:");
    scanf("%d",&r);
    conversion(num,r);
    return 0;
    /*括号匹配*/
    char str[100];
    printf("请输入括号\n");
    gets(str);
    BracketMatch(str);
    return 0;
}

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值