用栈实现括号匹配的检验
2011-01-28 11:09
417 查看
根据网上的一个例子改写.
原文地址:http://blog.sina.com.cn/s/blog_4eac972c0100blyn.html
////////////////////////////////////////////////////////////////////////////////////////////
以下用栈实现行编辑,输入'#'表示退格,输入'$'表示退行.
原文地址:http://blog.sina.com.cn/s/blog_4eac972c0100blyn.html
#include <Windows.h> #include <stdio.h> #define MAX_STACK_SIZE 10 #define INCREMENT_SIZE 10 #define OVERFLOW -1 #define OK 1 #define ERROR 0 typedef char ElemType; typedef int RESULT; typedef struct _SQSTACK_STRU { ElemType *pBase; // 栈底 ElemType *pTop; // 栈顶 int size; // 元素个数 }SQSTACK, *PSQSTACK; RESULT InitStack(PSQSTACK pStack) { pStack->pBase = (ElemType*)malloc(MAX_STACK_SIZE * sizeof(ElemType)); if (!pStack->pBase) { exit(OVERFLOW); } pStack->pTop = pStack->pBase; pStack->size = MAX_STACK_SIZE; return OK; } RESULT DestroyStack(PSQSTACK pStack) { free(pStack->pBase); pStack->pBase = NULL; pStack->pTop = NULL; pStack->size = 0; return OK; } bool IsEmptyStack(PSQSTACK pStack) { if (pStack->pBase == pStack->pTop) return TRUE; else return FALSE; } RESULT push(PSQSTACK pStack, ElemType e) { if (pStack->pTop - pStack->pBase >= pStack->size) { pStack->pBase = (ElemType*)realloc(pStack->pBase, (pStack->size + INCREMENT_SIZE) * sizeof(ElemType)); if (!pStack->pBase) exit(OVERFLOW); pStack->pTop = pStack->pBase + pStack->size; pStack->size += INCREMENT_SIZE; } *pStack->pTop++ = e; // 每增加一个元素,栈顶位置加一,pTop永远为栈尾的下一个元素 return OK; } RESULT pop(PSQSTACK pStack, ElemType *pe) { if (pStack->pBase == pStack->pTop) // 栈为空 return ERROR; else *pe = *--pStack->pTop; return OK; } void main(int argc, char **argv) { int i = 0; char szText[50]; char c; SQSTACK sqstack; bool bFlag = 1; // 分配栈空间 if (!InitStack(&sqstack)) printf("There is no enough room./n"); printf("The stack is preparative./n"); // 读入待分析的句子 printf("Please enter sequence including some Puncts, end with '#'./n"); do{ scanf("%c", &c); szText[i] = c; i++; }while (c != '#'); // 提取出句子中的括号字符,入栈出栈 i = 0; c = szText[i]; while (c != '#' && bFlag) { switch (c) { case '(': push(&sqstack, c); break; case '[': push(&sqstack, c); break; case '{': push(&sqstack, c); break; case ')': pop(&sqstack, &c); // 匹配则出栈 if (c != '(') bFlag = 0; break; case ']': pop(&sqstack, &c); if (c != '[') bFlag = 0; break; case '}': pop(&sqstack, &c); if (c != '{') bFlag = 0; break; } i++; c = szText[i]; } if (!IsEmptyStack(&sqstack)) // 如果括号全部匹配,则上述分析完成后,栈应该回归空;如果栈中仍有元素,则表明有元素未出栈,即有括号未匹配 bFlag = 0; if (bFlag) printf("match./n"); else printf("no match./n"); DestroyStack(&sqstack); }
////////////////////////////////////////////////////////////////////////////////////////////
以下用栈实现行编辑,输入'#'表示退格,输入'$'表示退行.
RESULT ClearStack(PSQSTACK pStack) { *pStack->pBase = '/0'; pStack->pTop = pStack->pBase; return OK; } void main(int argc, char **argv) { int c, i = 0; SQSTACK sqstack; ElemType e; InitStack(&sqstack); while ((c = getchar()) != EOF && c!= '/n') { if ( c != '#' && c != '$') { push(&sqstack, (ElemType)c); } else { if (IsEmptyStack(&sqstack)) { printf("There is no chars./n"); continue; } switch ((char)c) { case '#': pop(&sqstack, &e); break; case '$': ClearStack(&sqstack); break; } } } if (!IsEmptyStack(&sqstack)) { *(sqstack.pTop) = '/0'; printf("%s/n", sqstack.pBase); // 注意此处的用法 } else { printf("Stack is empty./n"); } }
相关文章推荐
- 用栈实现括号匹配检验(java)
- 8、数据结构笔记之八栈的应用之括号匹配检验实现
- 用栈实现括号匹配的检验
- 数据结构课程设计:括号匹配问题(实现检验匹配并输出不匹配的位置)
- 数据结构(C语言版)page49 3.22括号匹配的检验——用栈来实现
- 使用栈实现进制转换、括号匹配的检验、行编辑程序
- 简单算法——使用栈实现括号匹配检验
- 用栈实现括号匹配的检验
- 【数据结构】用栈实现括号匹配的检验
- 括号的匹配检验
- 数据结构栈之括号匹配(STL实现&&数组栈实现)
- 华为笔试题--LISP括号匹配 解析及源码实现
- 行编辑程序、括号匹配检验
- 栈实现括号匹配
- 数据结构——栈实现括号匹配
- 栈的实现-括号匹配
- 栈之括号匹配问题(java实现)
- C++实现算术表达式的括号匹配
- 栈匹配括号(C++ STL实现)
- 括号匹配问题——用栈实现