今天复习数据结构,在栈、队列和数组这一章看到了一个使用栈的算法,于是动手来把它实现了。
代码如下:
#include<iostream>
#include <cstdio>
#include<string.h>
#include "LinkStack.h"
using namespace std;
typedef int SElemType;
void printMatchedPairs(char *expression)
{
LinkStack s;
initStack(s);
int j,length=strlen(expression);
for(int i=1;i<=length;i++)
{
if(expression[i-1]=='(')
Push(s,i);
else if(expression[i-1]==')'){
if(Pop(s,j))
cout<<j<<"与"<<i<<"匹配"<<endl;
else
cout<<"栈空,没有与第"<<i<<"个右括号匹配的左括号!"<<endl;
}
}
while(!isEmpty(s)){
Pop(s,j);
cout<<"没有与第"<<j<<"个左括号相匹配的右括号!"<<endl;
}
}
int main()
{
char ch[100];
cout<<"Please enter the string(end with '\\n'):"<<endl;
gets(ch);
printMatchedPairs(ch);
return 0;
}
其中LinkStack.h中的内容为:
#include <iostream>
using namespace std;
typedef int SElemType;
typedef struct node{
SElemType data;
struct node *link;
}LinkNode,*LinkStack;
void initStack(LinkStack &S)
{
S=new LinkNode;
if(S==NULL)
{
cerr<<"存储分配失败"<<endl;
exit(1);
}
S->link=NULL;
}
void clearStack(LinkStack &S)
{
LinkNode *p;
while(S->link!=NULL)
{
p=S->link;
S->link=p->link;
delete p;
}
}
void Push(LinkStack &S,SElemType x)
{
LinkNode *p=new LinkNode;
if(p==NULL)
{
cerr<<"存储分配失败"<<endl;
exit(1);
}
p->data=x;
p->link=S->link;
S->link=p;
}
bool Pop(LinkStack &S,SElemType &x)
{
if(S->link==NULL)
return false;
LinkNode *p;
p=S->link;
x=p->data;
S->link=p->link;
delete p;
return true;
}
bool getTop(LinkStack &S,SElemType &x)
{
if(S->link==NULL)
return false;
x=S->link->data;
return true;
}
bool isEmpty(LinkStack &S)
{
return S->link==NULL;
}
int sizeOfStack(LinkStack &S)
{
LinkNode *p=S->link;
int count=0;
while(p!=NULL)
{
p=p->link;
count++;
}
return count;
}
这个算法的思路比较简单,它使用了一个字符数组来存储需要判断的字符串,同时使用一个栈来存储字符串中的所有左括号。当字符串输入到字符数组之后,程序依次判断字符是否为括号。当出现左括号时,将左括号位置压栈,然后继续判断下一个字符。当出现右括号时,如果此时栈为空,说明此位置的右括号没有相应的左括号与之匹配,输出错误信息;若栈不空,则输出当前匹配的左右括号的位置。程序一直判断,直到字符串的结尾。此时,若栈不为空,说明有剩余的左括号未被右括号匹配,输出错误信息。
总体来说,实现这个算法还是比较轻松简单的,唯一的问题就是在输入字符串时,由于输入法的问题,输入的字符“(”为中文的"(“,从而导致程序出错,这个很值得注意。