#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("括号不匹配");
}
}
你这里好像是因为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("括号不匹配");
}
}