栈结构具有后进先出的特点。括号匹配问题描述:若表达式中包含三种括号:圆括号、方括号和花括号,它们可以相互嵌套。
算法思想:检验算法中可设置一个栈,每读入一个括号,若是左括号,则直接进栈,等待相匹配的同类右括号;若读入的是右括号,且与当前栈顶左括号同类型,则二者匹配,将栈顶的左括号弹出,否则属于不合法情况。另外。如果输入序列已经读完,而栈中仍有等待匹配的左括号,或者读入一个右括号,而栈中已无等待匹配的同类型左括号,均属于不合法情况。当输入序列和栈同时变空的时候,说明所有括号完全匹配。
程序:括号匹配算法
#include<stdio.h>
#include<iostream>
#define FALSE 0
#define TRUE 1
using namespace std;
//链栈实现,采用链表作为存储结构来实现栈
typedef struct node{
char data;
struct node *next;
}linkStackNode;
typedef linkStackNode *linkstack;
int push(linkStack top,char x);
int* pop(linkStack top);
void bracketMatch(char *str);
bool match(char l,char r);
int main(){
char a[30];
cin.get(a,30); //有些类似getline。可以输入多个单词,中间空格隔开。
bracketMatch(a);
}
int push(linkStack top,char x){ //将元素x压入到栈top中
linkStackNode *temp;
temp=(linkStackNode *)malloc(sizeof(linkStackNode));
if(temp==NULL) return(FALSE);//申请空间失败
temp->data=x;
temp->next=top->next;
top->next=temp; //修改当前栈顶指针
return(TRUE); //头插法
}
char* pop(linkStack top){//将栈top元素的栈顶元素弹出,返回弹出元素的存储空间
linkStackNode *temp;
char *x;
temp=top->next;
if(temp==NULL) return(FALSE);
top->next=temp->next;
*x=temp->data;
free(temp);
return(*x);
}
bool match(char l,char r){
bool judgematch=FALSE;
if((l='('&&r=')')||(l='['&&r=']')||(l='{'&&r='}'))
judgematch=TRUE;
return judgematch;
}
void bracketMatch(char *str){//str[]中为输入的字符串,利用堆栈技术检查该字符串中的括号是否匹配
linkStack s;
int i;
char ch;
for(i=0;str[i]!='\0';i++){
switch(str[i]){
case '(':
case '[':
case '{': //若为左括号则进栈
push(&s,str[i]);
break;
case ')':
case ']':
case '}': //左括号时候
if(s->next==NULL){ //如果栈空
cout<<"右括号多余"<<endl; return;}
else{
&ch=s->next->data;
if(match(ch,str[i]))
pop(&s,&ch); //已匹配的左括号出栈
else{
cout<<"对应的左右括号不同类"<<endl; return;}
}
}
if(s->next=NULL)
cout<<"括号匹配"<<endl;
else
cout<<"左括号多余"<<endl;
}
}
在此还可以通过C++标准库(STL)中,实现了栈和队列,方便使用,并提供了若干方法。