算法:检测表达式中的字符,若是左括号就入栈,如果是右括号就出栈一个元素与其配对,配对成功则继续访问下一个字符,否则退出。出现非括号字符则跳过。
#include"Stack.h" int main() { Stack S; int i = 0; char str[MAX_SIZE]; printf("请输入表达式:"); gets(str);//从控制台获取字符串赋值给str(ascll码形式) StackInit(&S); for(i = 0;i<strlen(str);i++) { if(str[i] == '(' || str[i] == '{'|| str[i] == '[' ) { StackPush(&S, str[i]); } else if(str[i] == ')' && StackTop(&S) == '(') { StackPop(&S); } else if(str[i] == '}' && StackTop(&S) == '{') { StackPop(&S); } else if(str[i] == ']' && StackTop(&S) == '[') { StackPop(&S); } else { i++; } } if(StackEmpty(&S)) { printf("括号匹配!\n"); } else { printf("括号不匹配!\n"); } return 0; system("pause"); }
#include"Stack.h" void StackInit(Stack* S) { S->_bottom = S->_top = 0; S->len = 0; } void StackPush(Stack* S, DataType data) { if(S->len == MAX_SIZE) { printf("栈满溢出,添加失败!\n"); return; } S->_top++; S->_arr[S->_top] = data; S->len++; printf("入栈成功!!\n",data); } void StackPop(Stack* S) { if(S->len == 0) { printf("栈为空!!!\n"); return; } //printf(" %d 出栈\n",S->_arr[S->_top]); S->_top--; S->len--; //printf("此时栈顶元素为:%d\n",S->_arr[S->_top]); } DataType StackTop(Stack* S) { int ret = 0; if(S->len == 0) { printf("栈为空!\n"); return; } ret = S->_arr[S->_top]; return ret; } int StackSize(Stack* S) { int ret = 0; ret = printf("栈中元素个数为:%d\n",S->len); return ret; } int StackEmpty(Stack* S) { if(S->len == 0 ) { printf("栈为空!!\n"); return 1; } else { printf("栈不为空\n"); return 0; } }
#pragma once #include<stdio.h> #include<stdlib.h> #include<string.h> typedef int DataType; #define MAX_SIZE 100 typedef struct Stack { DataType _arr[MAX_SIZE];//栈的元素最大个数 int _top;//栈顶 int _bottom;//栈低 int len;//栈大小 }Stack; void StackInit(Stack* S); void StackPush(Stack* S, DataType data); void StackPop(Stack* S); DataType StackTop(Stack* S); int StackSize(Stack* S); int StackEmpty(Stack* S);