数制转换:将十进制数转换为任意进制数。由数制转换的计算公式 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");elseprintf("括号匹配失败\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;
}

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

  1. 栈(Stack),轻松解决数制转换和括号匹配问题!

    http://data.biancheng.net/view/9.html 栈,线性表的一种特殊的存储结构.与学习过的线性表的不同之处在于栈只能从表的固定一端对数据进行插入和删除操作,另一端是封死的. ...

  2. 数据结构:利用栈实现数制转换

    数制转换 从键盘输入一个十进制数n,并输入要转换的进制数m,利用栈将n转换成m进制,并输出转换后的结果. 首先设计一个含有多个菜单项的主菜单程序,然后再为这些菜单项配上相应的功能. 主菜单设计要求: ...

  3. sdut 2134 数据结构实验之栈与队列四:括号匹配

    数据结构实验之栈与队列四:括号匹配 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descript ...

  4. 数据结构 栈的实例应用,括号匹配

    引用栈的顺序存储,实现括号匹配问题查找: 头文件: #pragma once#include<string.h> #include<stdlib.h>#define MAX 1 ...

  5. python中用函数设计栈的括号匹配问题_数据结构和算法(Python版):利用栈(Stack)实现括号的匹配问题...

    算法 数据结构 数据结构和算法(Python版):利用栈(Stack)实现括号的匹配问题 在平时写程序当中,我们会经常遇到程序当中括号的匹配问题,也就是在程序当中左括号的数量和右括号的数量必须相等.如 ...

  6. java 顺序栈_java用顺序栈实现数制转换 求完整程序!!

    展开全部 用顺序栈实现数制e69da5e6ba9062616964757a686964616f31333335343436转换的Java程序如下:import java.util.Scanner; i ...

  7. java使用链栈实现数制转换

    java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html 将前面java实现链栈的代码稍作修改: package linkedst ...

  8. c++栈的基础应用,括号匹配、逆波兰表达式求值

    //#include<iostream> //#include<string> //#include<iomanip> //#include<cstdlib& ...

  9. 如何利用计算机进行数制转换,如何教授计算机基础中的数制转换内容

    摘 要: 作者从在计算机基础教学中有关数制转换中学生作业中发现的问题入手,加以分析和有效解决,不仅保证教学效果,而且进一步提高教学质量. 关键词: 计算机基础教学 Windows计算器 数制转换法 在 ...

最新文章

  1. Python基础 --- 使用 dict 和 set
  2. 粒子群算法tsp java_粒子群算法解决TSP问题汇总.doc
  3. Android 中shape的使用(圆角矩形)
  4. ITK:从函数返回对象
  5. Blender文档翻译:Operators tutorial(操作教程)
  6. 微x怎么设置主题_红人堂:抖音直播预告文案怎么写?5个小技巧提高你的文案吸引力!...
  7. 【动态规划】书的复制 (ssl 1203)
  8. 数据湖 data lake_在Data Lake中高效更新TB级数据的模式
  9. S5PV210裸机之GPIO
  10. Python-Flask实现基金自选网站
  11. ORACLE 制定时间 加N月
  12. 顺序表操作集 (20 分)
  13. 欧姆龙PLC伺服功能块 功能块可供选择脉冲0-3,脉冲输出方式CW/CCW或者脉冲加方向
  14. 斐讯手表怎么刷机华为系统_智能手表怎么刷机?
  15. RGB和CMYK的区别
  16. 汇编编程:在屏幕中间分别显示绿色,绿底红色,白色蓝底的字符串’welcome to masm!’
  17. H3C ipsec psk aggressive mode配置
  18. Mac关闭fn切换输入法功能
  19. SecTalks: BNE0x00 - Minotaur靶机
  20. 【PCL】.asc文件转换为.pcd文件

热门文章

  1. H3C 路由器交换机模拟器
  2. portalv15安装 tia_安装了TIA Portal V15.1软件,所有程序里有TIAV15.1图标,怎么桌面上没有TIA V15.1的图标?-工业支持中心-西门子中国...
  3. 中国科学院计算机所张浩,航天科技集团调研组到计算所交流
  4. hive的列分隔符和行分隔符的使用
  5. 状态空间方程转换传递函数
  6. javac -d . hello.java中的 -d .是什么作用?
  7. 线性代数库 Armadillo 学习笔记
  8. 三种方法解决git拒绝连接问题fatal: unable to access xxxx: Failed to connect to xxxx : Connection refused
  9. spark python_Python、流、SQL 有更新!耗时两年,Spark 3.0 重磅发布!
  10. js时间戳转换为日期时间格式