根据网上的一个例子改写. 原文地址: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"); } }