以下是数据结构中关于顺序栈的小括号匹配的基础操作(编程风格参考天勤数据结构)。
声明和初始化
typedef struct SqStack{
char data[100];//数据
int top;//栈底
}Sqstack;
void initial(Sqstack &st){
st.top = -1;//当top为-1时,顺序栈为空;
}
在这里设置top=-1表示栈空。当有元素进栈时,top先自增成0,这样设计数组的下标可以直接用top表示,紧接着元素按照下标入栈。
当然,如果top=0,那就是数组下标用top表示元素入栈的位置,然后再自加1。
匹配过程
void match(Sqstack &st,char data[]){
int length = 0;
for(int i=0;data[i]!='\0';i++){
length++;
}
for(int i=0;i<length;i++){
if(data[i]=='('){
st.data[++st.top] = data[i];
}
if(data[i]==')'){
if(!isNotEmpty(st)){
cout<<"error!\n";//如果匹配到右括号但是栈是空的,就是出错了(说明右括号多于左括号)
return ;
}else
st.top--;//出栈
}
}
if(!isNotEmpty(st))//如果栈空,说明匹配完成
cout<<"success!\n";
else
cout<<"error!\n";
}
步骤:
- 输入小括号组成的字符串;
- 将字符串的元素逐一取出;
- 如果是左括号,则进栈;
- 如果是右括号,则判断当前栈是否为空,如果为空说明以该右括号为终点,起点到终点的右括号数量多于左括号数量,括号不匹配;如果栈不为空,则出栈一个元素,用来和右括号抵消;
- 当字符串遍历完毕后,检查栈是否为空:如果栈为空说明完全匹配;如果栈不为空说明左括号大于右括号。
运行截图
源码
/*
广西师范大学 计算机科学与工程学院
GuangXi Normal University
College of Computer Science and Engineering
Student STZ
*/
#include<iostream>
#include<stdio.h>
using namespace std;
typedef struct SqStack{
char data[100];//数据
int top;//栈底
}Sqstack;
void initial(Sqstack &st){
st.top = -1;//当top为-1时,顺序栈为空;
}
int isNotEmpty(Sqstack &st){
if(st.top != -1){
return 1;
}else{
// cout<<"栈已空。"<<endl;
return 0;
}
}
void match(Sqstack &st,char data[]){
int length = 0;
for(int i=0;data[i]!='\0';i++){
length++;
}
for(int i=0;i<length;i++){
if(data[i]=='('){
st.data[++st.top] = data[i];
}
if(data[i]==')'){
if(!isNotEmpty(st)){
cout<<"error!\n";//如果匹配到右括号但是栈是空的,就是出错了(说明右括号多于左括号)
return ;
}else
st.top--;//出栈
}
}
if(!isNotEmpty(st))//如果栈空,说明匹配完成
cout<<"success!\n";
else
cout<<"error!\n";
}
int main(){
Sqstack st;//存放左括号
initial(st);
char data[100];
cout<<"请输入小括号:" ;
scanf("%s",&data);
match(st,data);
return 0;
}
书上只要求匹配小括号,其实用左右栈的方式也可以。具体步骤如下:
- 将左括号放入左栈,右括号放入右栈;
- 左右栈同时出栈,左栈+1与右栈进行匹配即可(ASCII码里(数值为40,)数值为41)。
只匹配小括号的方式太多太多了,就不一一列举了。有时间的话更新一波可以匹配大中小括号的括号匹配问题。