栈的简单应用1-平衡符号
2014-11-20 23:33
218 查看
因为在编程中,使用{}()[]等都是成对出现的,因此可以使用栈来进行一些匹配判断。
原理:
读取一段字符串,如果遇到{([这些开放字符,就将其压入栈中,如果读到})]这些封闭字符,就与当前栈顶的符号进行比较,如果栈顶的符号正好是其对应的开放符号,将栈顶元素弹出,继续读取。否则,出现警告。但是如果弹出栈顶后新的栈顶是与其匹配的开放符号,那么就是它出错了。如果全部字符串读取完毕但是栈不是空的的话,那么栈剩下的字符串都缺少匹配。
简单代码,因为使用的输入流问题对程序实现有较大误差,但思路没有问题,需要在C下修改使用,因为时间关系今天就结束这个问题。此代码没有实现对于全部字符读取完毕的检测,还有一些严重问题没有处理,所以此程序应该是失败的。请读者自己根据实际实现。
main.cpp
stack.h
抱歉。
以上。
原理:
读取一段字符串,如果遇到{([这些开放字符,就将其压入栈中,如果读到})]这些封闭字符,就与当前栈顶的符号进行比较,如果栈顶的符号正好是其对应的开放符号,将栈顶元素弹出,继续读取。否则,出现警告。但是如果弹出栈顶后新的栈顶是与其匹配的开放符号,那么就是它出错了。如果全部字符串读取完毕但是栈不是空的的话,那么栈剩下的字符串都缺少匹配。
简单代码,因为使用的输入流问题对程序实现有较大误差,但思路没有问题,需要在C下修改使用,因为时间关系今天就结束这个问题。此代码没有实现对于全部字符读取完毕的检测,还有一些严重问题没有处理,所以此程序应该是失败的。请读者自己根据实际实现。
main.cpp
#include "stack.h" char matchSymbal(char s) { if (s == ')') return '('; if (s == '}') return '{'; if (s == ']') return '['; return ' '; } int main(void) { stack *symbal = createStack(10); char s; char tmp; while (std::cin>>s) { if (s == '{' || s == '(' || s == '[') { push(symbal, s); continue; } if (s == '}' || s == ')' || s == ']') { if (isEmpty(symbal)) { log("空表错误"); } else { tmp = top(symbal); if (top(symbal) == matchSymbal(s)) { pop(symbal); continue; } else { pop(symbal); if (top(symbal) == matchSymbal(s)) { std::cout << "在 " << tmp << " 处发生错误" << std::endl; continue; } std::cout << "在 " << s << " 处发生错误" << std::endl; } } } } system("pause"); return 0; }
stack.h
/*数组栈*/ #include "iostream" #include "stdlib.h" #define minSize 5 #define emptyStack -1 #define fullStack -2 #define log(s); std::cout<<s<<std::endl; typedef struct _stack_ { int capacity; int topOfStack; char *Array; }stack; stack *createStack(int maxSize) { stack *s; if (maxSize < minSize) { //log("Stack size is too small"); return nullptr; } s = (stack *)malloc(sizeof(stack)); s->Array = (char *)malloc(sizeof(char) * maxSize); s->capacity = maxSize; s->topOfStack = emptyStack;/*初始化为空栈*/ return s; } int isFull(stack *s)/*检测是否为满栈*/ { if (s == nullptr) { //log("the stack has not inital"); return fullStack; } return s->topOfStack == s->capacity; } int isEmpty(stack *s)/*是否为空栈*/ { if (s == nullptr) { //log("the stack has not inital"); return emptyStack; } return s->topOfStack == emptyStack; } void push(stack *s, char data)/*压栈*/ { if (isFull(s)) { //log("Full of Stack"); return; } ++s->topOfStack; s->Array[s->topOfStack] = data; } void pop(stack *s)/*弹出栈*/ { if (isEmpty(s)) { //log("Out of Stack"); return; } --s->topOfStack; } char top(stack *s)/*访问栈顶元素*/ { if (isEmpty(s)) { //std::cout << "Out of Stack,Code is "; return emptyStack; } return s->Array[s->topOfStack]; } void makeEmpty(stack *&s)/*置空栈*/ { free(s->Array); free(s); s = nullptr; }
抱歉。
以上。
相关文章推荐
- python中stack在实际中的简单应用之平衡符号
- 重学数据结构005——栈的应用之平衡符号
- 堆栈的应用(1) 平衡符号 C++实现
- 栈的应用--栈用作判断平衡符号,[()]对的,[(])错的
- 栈的应用之检测平衡符号
- 栈的应用 平衡符号 后缀表达式 中缀到后缀的转换
- 堆栈的应用(1) 平衡符号 C++实现
- 栈(Stack)的应用2例--符号平衡和撤销的实现
- 堆栈的应用--用C语言实现平衡符号
- 栈的应用---平衡符号的检测
- 栈的应用之平衡符号
- Allegro建立符号 文件的意思及简单应用
- 平衡符号(栈应用一)
- 栈的应用:平衡符号问题
- javascript栈的应用之符号平衡
- 栈的应用之平衡符号
- 栈的应用---平衡符号
- 栈的应用实例——平衡符号
- Java栈的应用检测平衡符号
- 栈应用—平衡符号