(第1种)括号匹配,判断一个表达式中的括号是否匹配。
前情提要
纯c版本,#号代表终止操作
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#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("栈顶元素是:%c\n",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("%c\n",pop(S));
}
else if(*(p--)==']'||*(p--)=='[')
return ERROR;
}
else if(*p==']')
{
if(*(p--)=='[')
{
printf("%c ",pop(S));
printf("%c\n",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]#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)