C语言实现 数据结构-栈-括号匹配
题目描述
假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。假设表达式长度小于255,左圆括号少于20个。
输入
输出
样例输入
((1+b)-(a+3))*4@
样例输出
YES
样例输入
(25+x)*(a*(a+b+b)@
样例输出
NO
算法实现:1.利用栈来实现只需要考虑输入的是不是左括号'(' ,右括号')'
2.当是左括号时 就让'('进栈 ,当遇到右括号是')'就出栈。p.s 这里栈我用的静态栈比较简单~
3.考虑栈里'('多余了,则用top判断,如果完全匹配那么栈里的top应该为初始值为等于-1,输出YES,否则输出NO
4.考虑栈元素下溢的问题,比如先输入了一个右括号')',那么我们直接判断他为NO,P.s:一开始我想如果表达式无所谓输入格式,先输入')'那不是下溢了嘛,后面在输入'(',感觉栈就不太管用了emmm,是我多虑了或者审题不清
#include <stdio.h>
#define maxsize 260
typedef struct stack
{
int top ;
char arr[maxsize];
}STACK ;
void init(STACK * ps);
bool push(STACK * ps ,char val);
void show_stack(STACK * ps);
// char pop(STACK * ps );
bool Match_Brackets(STACK * ps);
bool pop(STACK * ps );
int main()
{
int i,val;
STACK st ;
init(&st);
if(Match_Brackets(&st))
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
void init(STACK * ps)
{
ps->top = -1;
}
bool Match_Brackets(STACK * ps)
{
char ch,x ;
int flag = 0 ;
while(1)
{
scanf("%c",&ch);
if(ch == '@')
{
break ;
}
else if(ch=='(')
{
push(ps,ch);
// show_stack(ps);
}
else if(ch==')')
{
if(pop(ps))
{
// show_stack(ps) ;
}
else
{
return false ;
}
}
}
if(ps->top == -1)
{
return true ;
}
else return false ;
}
bool push(STACK * ps ,char val)
{
if(ps->top == maxsize-1)
{
// printf("栈已满\n");
return false ;
}
ps->arr[++ps->top]=val;
return true ;
}
void show_stack(STACK * ps)
{
int i = ps->top;
while(i!= -1)
{
printf("%c ",ps->arr[i--]);
}
printf("\n");
}
bool pop(STACK * ps )
{
char ch ;
if(ps->top == -1)
{
// printf("栈为空\n");
return false ;
}
else
{
ps->arr[ps->top--] ;
return true ;
}
}
原文地址:https://www.cnblogs.com/cocobear9/p/12582361.html
- 过时但仍值得学习的选项卡TabHost
- 你所不知道的渗透测试:应用虚拟化的攻防
- C++中const小结
- 很多人不知道还有这个——搜索框组件SearchView
- 免费主题暗藏后门,波及WordPress等知名CMS系统
- 揭秘:针对PoS机的恶意软件工具箱
- 屏幕宽高不够,滚动视图ScrollView来凑
- 结合中间人攻击,Pidgin鸡肋漏洞变废为宝
- 日历视图CalendarView和定时器Chronometer
- 不用Linux也可以的强大文本处理方法
- 虚函数与虚继承寻踪
- AnalogClock、DigitalClock和TextClock时钟组件
- Sqlmap联合Nginx实现“地毯式”检测网站SQL注入漏洞
- 两分钟掌握数值选择器NumberPicker
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android studio圆形进度条 百分数跟随变化
- Android中的SpannableString与SpannableStringBuilder详解
- 浅谈Android 中图片的三级缓存策略
- Android主线程和子线程区别详解
- Android 用RxBinding与RxJava2实现短信验证码倒计时功能
- Android右滑返回上一个界面的实现方法
- Android pull解析xml的实现方法
- Android实现QQ图片说说照片选择效果
- 一个简单的toolabar结合drawlayout使用方法
- 利用DrawerLayout和触摸事件分发实现抽屉侧滑效果
- Android App端与PHP Web端的简单数据交互实现示例
- Android开发实现读取assets目录下db文件的方法示例
- Android Textview实现颜色渐变滚动效果
- Android中fragment+viewpager实现布局
- android自动工具类TextUtils使用详解