#include<stdio.h>
#include<string.h>
//top变量时刻表示栈顶元素所在位置
int push(char *a,int top, int elem)//入栈操作
{
a[++top] = elem;
return top;
}
int pop(char *a,int top)
{
if (top == -1) {
return 0;
}
top--;
return top;
}
char visit(char *a,int top)
{
//调取栈顶元素,不等于弹栈,如果栈为空,为使程序不发生错误,返回空字符
if (top == -1)
{
return ' ';
}
else
{
return a[top];
}
}
int main()
{
int top = -1;
char a[30];
char bracket[100];
printf("请输入括号序列:");
gets_s(bracket);
getchar();
int length = (int)strlen(bracket);
for (int i = 0; i < length; i++)
{
//如果是左括号,直接压栈
if (bracket[i] == '(' || bracket[i] == '{' || bracket[i] == '[')//i=1 '(';i=2')'
{
push(a,top, bracket[i]);
}
else
{
//如果是右边括号,判断与栈顶元素是否匹配,如果匹配,栈顶元素弹栈,程序继续运行;否则,发现括号不匹配,输出结果直接退出
if (bracket[i] == ')')
{
if (visit(a,top) == '(')//如果匹配
{
pop(a,top);//弹栈栈顶元素
}
else {
printf("括号不匹配");
return 0;
}
}
else if(bracket[i]=='}')
{
if (visit(a,top) == '{') {
pop(a,top);
}
else {
printf("括号不匹配");
return 0;
}
}
else {
if (visit(a,top) == '[') {
pop(a,top);
}
else {
printf("括号不匹配");
return 0;
}
}
}
}
//如果所有括号匹配完成,栈内为空,说明所有括号全都匹配成功
if (top == -1) {
printf("括号匹配");
}
else {
printf("括号不匹配");
}
}
做了一个括号匹配算法,但是结果出错,能帮我看看吗
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- a5156520 2022-01-03 13:28关注
你这里好像是因为top在函数中修改了值,但是main函数里面的top却没有变,我该成了int型指针;另外,匹配下标好像有不对,我改为了length-1-i;然后修改了*top等于0是为匹配成功。不知道对不对,如下:
#include<stdio.h> #include<string.h> //top变量时刻表示栈顶元素所在位置 int push(char *a,int * top, int elem)//入栈操作 { a[++(*top)] = elem; //printf("a[%d]=%c\n",*top,a[(*top)]); return *top; } int pop(char *a,int top) { if (top == -1) { return 0; } top--; return top; } char visit(char *a,int top) { //调取栈顶元素,不等于弹栈,如果栈为空,为使程序不发生错误,返回空字符 if (top == -1) { return ' '; } else { return a[top]; } } int main() { int index=-1; int * top = &index; char a[30]; char bracket[100]; printf("请输入括号序列:"); gets(bracket); getchar(); int length = (int)strlen(bracket); for (int i = 0; i < length; i++) { //如果是左括号,直接压栈 if (bracket[i] == '(' || bracket[i] == '{' || bracket[i] == '[')//i=1 '(';i=2')' { push(a,top, bracket[i]); } else { *top = length-1-i; //如果是右边括号,判断与栈顶元素是否匹配,如果匹配,栈顶元素弹栈,程序继续运行;否则,发现括号不匹配,输出结果直接退出 if (bracket[i] == ')') { if (visit(a,*top) == '(')//如果匹配 { printf("),a[%d]=%c\n",*top,a[*top]); pop(a,*top);//弹栈栈顶元素 } else { // printf(")-,a[%d]=%c\n",*top,a[*top]); printf("括号不匹配"); return 0; } } else if(bracket[i]=='}') { if (visit(a,*top) == '{') { // printf("},a[%d]=%c\n",*top,a[*top]); pop(a,*top); } else { // printf("}-,a[%d]=%c\n",*top,a[*top]); printf("括号不匹配"); return 0; } } else { if (visit(a,*top) == '[') { // printf("],a[%d]=%c\n",*top,a[*top]); pop(a,*top); } else { // printf("]-,a[%d]=%c\n",*top,a[*top]); printf("括号不匹配"); return 0; } } } } //如果所有括号匹配完成,栈内为空,说明所有括号全都匹配成功 // printf("*top=%d\n",*top); if ((*top) == 0) { printf("括号匹配"); } else { printf("括号不匹配"); } }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥30 求给定范围的全体素数p的(p-2)的连乘积
- ¥15 VFP如何使用阿里TTS实现文字转语音?
- ¥100 需要跳转番茄畅听app的adb命令
- ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
- ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
- ¥50 opencv4nodejs 如何安装
- ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
- ¥15 nginx反向代理获取ip,java获取真实ip
- ¥15 eda:门禁系统设计
- ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页