栈的运用(2)
问题描述:
写一个算法,识别依次读入的一个以@为结束符的字符序列是否为形如‘序列1&序列2’模式的字符序列。其中序列1和序列2中都不含字符‘&’,且序列2是序列1的逆序列。例如,‘a+b&b+a’是属该模式的字符序列,而‘1+3&3-1’则不是
问题分析:
思路应该是有的,先读入字符序列,当读到‘&’时,前面的一个入队列,后面的一个进栈,然后都用数组来保存,最后比较两数组的元素是否都相同,若相同,则是该模式。
Int main()
{
Stack s;
Queue q;
Char buffer1[20];
Char buffer2[20];
Int i=0,count=0,j=0;
Char temp=’’;
Printf(“请输入字符序列”);
While(temp!=’@’){
Scanf(“%c”, &temp);
Buffer1[i]=temp;
I++;
}
While(buffer1[i]!=’&’){
Push(q,buffer1[i]);
I--;
}
If (buffer[i]==’&’)
{
Count++;
I--;
If(count==1)
{
While(buffer1[i])
{
Push(s,buffer1[i]);
I--;
}
}
Else
{
printf(“这不是模式的字符序列”);
Return ;
}
}
I=0;
j=0;
While(!stackempty(s)){
Pop(s,buffer1[i]);
I++;
}
While(!queueempty(q))
{
Pop(q,buffer2[j]);
J++;
}
If(i==j)
{
While(buffer[i])
{
If(Strcmp(buffer[i],buffer[j]))
{
I++;
j++;
}
Else
{
Printf(“这不是模式的字符序列”);
Return;
}
}//while
}//if
Else
{
Printf(“这不是模式字符序列”);
Return;
}
}
看得出我把问题弄复杂了,把复杂简单化,要理清思路。书上的算法:
Bool Symmetry(char a[])
{
Int i=0;
Stack s;
InitStack(s);
ElemType x;
While(a[i]!=’&’&&a[i])
{
Push(s, a[i]);
I++;
}
If(a[i]) return false;
I++;//跳过’&’这个字符
While(a[i])
{
Pop(s,x);//先弹出来,然后立即判断
If(x!=a[i]){
DestoryStack(s);
Return false;//表明已经不是模式字符串
}
I++;
}
Return true;
}