使用栈实现判断输入的符号是否匹配
来源:互联网 发布:java中的final与const 编辑:程序博客网 时间:2024/05/22 00:42
实现的大致原理是将所有左符号添加到栈中,当遇到右符号的时候就和栈顶元素做匹配,如果能匹配这将当前栈顶元素pop掉,从而使栈内始终都是左符号,只是将新输入的右括号与栈顶的做匹配,注意右符号是没有入栈的!/*date: 2014/6/5time: 20:07运行环境:windows 7 + MinGW + Sublime_text_3注意:此代码不能判断符号相互交叉的匹配,比如({)},只能测试{([])({})}类型的*/#include <iostream>#include <string>#include <cstdlib>using namespace std;struct Stack{int size;//stack's max sizechar *base;char *top;};bool init_stack(Stack &s)//初始化栈{char *tmp = new char[100];if (tmp == NULL){cout << "applay for memory failed" << endl;exit(1);}s.base = s.top = tmp;s.size = 100;//最大栈容量return true;}bool push(Stack &s, char ch)//插入元素{if (s.top - s.base > s.size - 1)//检查是否溢出{cout << "ERROR! STACKOVERFLLOW" << endl;return false;}*s.top = ch;//插入入元素s.top++;//栈顶指针上移return true;}bool pop(Stack &s)//删除元素{if (s.base == s.top){return false;}s.top--;//顶端指针下移}char get_top(Stack &s)//获取栈顶元素{if (s.base == s.top){return false;}char *tmp = s.top;//使用tmp表示临时指针,防止栈顶指针被修改tmp--;return *tmp;}bool empty(Stack &s)//判断是否为空栈{if (s.base == s.top)return true;elsereturn false;}//遍历全栈的函数,测试时用,能正常使用时可以不用void traversal(Stack &s){if (s.base == s.top){cout << "empty" << endl;return;}char *tmp = s.top;tmp--;while (tmp >= s.base){cout << *tmp << "";tmp--;}cout << endl;}////////////////////////////////////////////////int main(int argc, char const *argv[]){Stack s;init_stack(s);char str[100];cout << "input a charactor string \"() {} []\"" << endl;cin >> str;for (int i = 0; i < strlen(str); ++i){switch(str[i]){//如果是左括号都将其入栈case '(': push(s, '('); break;case '[': push(s, '[');break;case '{': push(s, '{');break;//如果是右括号,case ')': if (empty(s) || get_top(s) == ')')//判断当前栈是否为空,或者栈顶已经是右括号push(s, ')');//继续入栈else if (get_top(s) == '(') //如果正好前后匹配,则清除栈顶元素pop(s);break;case ']':if (empty(s) || get_top(s) == ']')push(s, ']');else if (get_top(s) == '[')pop(s);break;case '}':if (empty(s) || get_top(s) == '}')push(s, '}');else if (get_top(s) == '{')pop(s);break;default:cout << "what you've input is invalid" << endl;return 1;}}if (s.base == s.top)cout << "congratuate, all charactor has matched" << endl;elsecout << "sorry! \'" << *s.base << "\' can not matched" << endl;//只能输出栈底没有匹配的符号return 0;}/*测试字符串:((({{[[[(({[]}))]]]}})))*/
0 0
- 使用栈实现判断输入的符号是否匹配
- 使用栈判断符号是否匹配
- 用栈判断输入的括号是否匹配
- 【STL】:使用栈来进行符号匹配的判断
- 判断输入的文字花括号是否匹配
- 全部输入是小括号的字符串,判断是否匹配
- Matlab 使用栈判断括号是否匹配
- 使用栈判断输入的表达式中括号是否配对
- 栈的应用----判断括号是否匹配
- python实现不使用额外的空间判断输入数字是否是回文数
- 判断括号是否匹配的递归与非递归实现
- 利用栈判断输入的表达式中的括号是否匹配(假设只含有左、右括号)
- Java栈实现判断分隔符是否匹配
- 实现键盘的输入学生成绩,并判断是否有效.
- 使用数组判断输入的五位数是否为回文
- 第5周时间项目3 判断输入的左右括号是否匹配
- 使用纯递归判断括号是否匹配
- 使用链栈判断输入的表达式中的括号是否配对
- 关于VS2013的初步使用心得
- android读写assets目录下面的资源文件(文件夹)
- 谷歌被屏fonts.googleapis.com导致WordPress速度大降
- 软工文档——系统、程序流程图、系统流图
- com.sun.mail.smtp.SMTPSendFailedException: 530 Authentication required 解决方案
- 使用栈实现判断输入的符号是否匹配
- Oracle添加SCOTT用户
- MySQL学习笔记之十四 备份和恢复数据表的方法
- XCode快捷键
- IOC 模式
- 【冷却游戏】 安卓版 俄罗斯方块游戏 官方版
- 详解隐藏windows系统托盘图标
- win7 ubuntu 双系统 重装win7
- TimesTen修改CacheGroup管理用户在ORACLE端及TT端密码【TimesTen运维基础】