纯c版本,#号代表终止操作
#include#include #include #define maxsize 100 typedef int status;//使后面可以使用status类型,用来表示成功或失败状态 #define ERROR -1 #define OK 1 typedef struct { char *base; char *top; int stacksize; }sqstack; status init(sqstack *S) {//顺序栈的初始化 S->base=(char *)malloc(sizeof(char)); if(!S->base) exit(OVERFLOW); S->top=S->base; S->stacksize=maxsize; return OK; } status push(sqstack *S,char e)//顺序栈入栈 {//插入元素e为新的栈顶元素 if(S->top-S->base==S->stacksize) return ERROR; *S->top++=e; return OK; } char pop(sqstack *S)//顺序栈出栈 {//删除S的栈顶元素,用e返回其值 char e; if(S->top==S->base) return ERROR; e=*(--S->top); return e; } char gettop(sqstack *S)//取栈顶元素 {//返回S的栈顶元素,不修改栈顶指针 if(S->top!=S->base) return *(S->top-1); } status StackTraverse(sqstack *S) { // 从栈顶到栈底依次输出栈中的每个元素 if(S->top==S->base)printf("The Stack is Empty!");//判断栈是否为空 else { printf("The Stack is: "); S->top--; while(S->top>=S->base) { printf("%c ", *S->top); S->top--; } } printf("n"); return OK; } void choose() { printf("命令展示n"); printf("1:展示栈顶元素n"); printf("2:插入新元素n"); printf("3:删除栈顶元素n"); printf("4:展示栈元素n"); printf("5:退出n"); printf("6:括号匹配n"); } void order(sqstack *S) { int n;char e; choose(); printf("请问你想选择的功能n"); scanf("%d",&n); switch(n) { case 1: e=gettop(S);printf("栈顶元素是:%cn",e);order(S);break; case 2: { printf("请输入你要插入的元素:n"); scanf("%s",&e); push(S,e);order(S);break; } case 3: { printf("返回的被删除栈顶元素:"); e=pop(S);putchar(e);putchar('n'); order(S);break; } case 4:StackTraverse(S);order(S);break; case 5: exit(0);break; case 6:if(check(S)) printf("匹配正常"); else printf("匹配错误"); break; default:exit(0); } } int main() { sqstack Sta; sqstack *S=&Sta; init(S); order(S); return 0; } status check(sqstack *S)//读取和比较 { char *p,e; printf("n启动括号匹配程序n"); printf("请输入你的算式n"); scanf("%c",&e); //第一个括号的检测 while(e!='(' && e!='[') //忽略数字等其他符号,直到输入括号 { if(e==')' || e==']' || e=='#') return ERROR; //若为')'或']',则表明不匹配。'#'用于结束输入 scanf("%c",&e); } if(e=='(' || e=='[') push(S,e); //检测到左括号,进栈 scanf("%c",&e); while(e!='#') { if(e=='('||e=='['||e==')'||e==']') push(S,e); p=S->top; if(*(p)==')') { if(*(p--)=='(') { printf("%c ",pop(S)); printf("%cn",pop(S)); } else if(*(p--)==']'||*(p--)=='[') return ERROR; } else if(*p==']') { if(*(p--)=='[') { printf("%c ",pop(S)); printf("%cn",pop(S)); } else if(*(p--)=='(') return ERROR; } scanf("%c",&e); } if(S->top==S->base) return OK; else return ERROR; }
输出
输入
6 (5+6)*[9-5]#



