题目:栈的一种应用是检测代码中的括号是否正确匹配。例如:
代码形如{...(...)...[...]...} 为正确匹配。
代码形如{...[...]...}...} 错误,多了一个}。
代码形如{...[...}...]虽然数量正确,但次序错误。
编写程序,读入一个字符串,其中包含{}、[]、()三种括号,检查该字符串中的括号是否正确匹配。
提示:
依次读入每个字符。(1)若遇到左括号,压栈。(2)若遇到右括号,检查栈顶的左括号:若与右括号匹配,则弹出栈顶左括号;若不匹配,说明匹配错误;若栈中无内容,说明匹配错误。(3)若遇到其他符号,忽略之。(4)若字符串已读完,此时栈中仍有内容,说明匹配错误。
重点:关于栈的实现,以及对于去括号的理解
1.基于数组的顺序栈结构声明:
struct Stack {
int * Data; // 栈空间
int Top; // 栈顶,为-1时表示空栈
int MaxSize; //栈的最大容量
};
2.堆栈的创建:
struct Stack*Creat(int MaxSize){
struct Stack*S;
S=malloc(sizeof(struct Stack));
S->Data=malloc(sizeof(int)*MaxSize);
S->Top=-1;
S->MaxSize=MaxSize;
return S;
}
3.对于数据进栈:
void Push(struct Stack*S,int x){
if(S->Top==S->MaxSize){
printf("Stack is full");//若栈顶为栈的最大容量,则栈满
return;
}
S->Data[++S->Top]=x;
}
4.对于数据出栈:
int Pop(struct Stack*S){
if(S->Top==-1){
printf("Stack is empty");//如果没有元素,则栈为空
return ;
}
return S->Data[S->Top--];//若有元素,出栈后栈顶元素发生改变。
}
实验源程序:
#include<stdio.h>
#include<stdlib.h>
struct Stack {
int * Data; // 栈空间
int Top; // 栈顶,为-1时表示空栈
int MaxSize; //栈的最大容量
};
struct Stack* Create()
{
struct Stack *S;
S=(struct Stack*)malloc(sizeof(struct Stack));
S->MaxSize=200;
S->Top=-1;
S->Data=(int *)malloc(sizeof(int)*S->MaxSize);
return S;
};
void Push(struct Stack *S,int n)
{
if(S->Top==S->MaxSize-1){
return;
}
S->Data[++S->Top]=n;
};
int Pop(struct Stack *S)
{
if(S->Top==-1)
{
return;
}
return S->Data[S->Top--];
}
int main()
{
int i=0,n=1,x=1;
char L[100];
gets(L);//获取字符串L
struct Stack *S;
S=Create();//创建空栈
while(L[i]!='\0')
{
switch(L[i])
{
case '(': Push(S,'(');break;//若为左括号则压栈
case ')': n=Pop(S);//若为右括号则和栈顶元素作比较
if(n!=40)//若符号不匹配,x=-1并跳出循环语句。
x=-1;
break;
case '[': Push(S,'[');break;
case ']': n=Pop(S);
if(n!=91)
x=-1;
break;
case '{': Push(S,'{');break;
case '}': n=Pop(S);
if(n!=123)
x=-1;
break;
}
i++;
if(x==-1)
break;
}
if(x==-1||S->Top!=-1)
printf("匹配错误\n");
else
printf("匹配成功\n");
return 0;
}