1028: 特定字符序列的判断
题目描述 编写一程序,识别依次读入的一个以“#”为结束符的字符序列是否为形如“序列1@序列2”模式的字符序列。期中序列1和序列2中都不含字符“@”,且序列2是序列1的逆序列。例如“a+b@b+a”是满足条件的序列字符,而“1+3@3-1”则不是。
输入
一个以“#”结束的字符序列。
输出
是满足条件的字符序列输出“yes!”;否则输出“no!”。
样例输入
a+b@b+a#
样例输出
yes!
思路: 该题是配对问题,用栈就可以完成。
#include<bits/stdc++.h>
# define maxsize 50
using namespace std;
struct Stack
{
char data;
Stack *next;
};
void creat(Stack *&p)
{
p=new Stack;
p->next=NULL;
}
void Push(Stack *&p,char ch)
{
Stack *l;
l=new Stack;
l->data=ch;
l->next=p->next;
p->next=l;
} //头插法入栈
void Pop(Stack *&p)
{
if(p->next==NULL) return;
p->next=p->next->next;
}
void Search(Stack *&p,char str[],int len)
{
int num=0;
for(int i=0;i<len;i++)
{
if(str[i]=='#') return;
else
{
if(str[i]=='@') num=1;
else if(num==0)
{
Push(p,str[i]);
}
else if(num==1)
{
if(str[i]==p->next->data) Pop(p);
}
}
}
}
void judge(Stack *&p)
{
if(p->next==NULL) cout << "yes!";
else cout << "no!";
}
int main()
{
char str[maxsize];
cin >> str;
int len=strlen(str);
Stack *p;
creat(p);
Search(p,str,len);
judge(p);
return 0;
}