问题描述:判断所输入的以‘@’为结束标记的 字符串是否形如“序列1&序列2”的形式,其中序列1和 序列2都不含‘&’字符,序列1是序列2的逆序列,比如 “a+b&b+a@”就是一个属于该模式的字符串,而 “a+b&b-a@”则不是。
PS:共使用三种方式判断,各有优劣
代码如下:
#include<cstdio>
#include<iostream>
#include<cstring>
#define MAXSIZE 50
typedef struct SeqStack
{
int data[MAXSIZE];
int top;
}SeqStack;
SeqStack s;
typedef struct Node
{
int data;
struct Node *next;
}*LinkStack;
LinkStack top;
int Seq_Judege(char a[MAXSIZE])//用数组判断,判是O(2/n),判否O(1)
{
int len, i, j;
len = strlen(a);
if (a[len - 1] != '@')
printf("ERROR!\n");
if (a[(len - 1) / 2] != '&')
return 0;
for (i = len - 2, j = 0; i != j; i--, j++)
if (a[i] != a[j])
return 0;
return 1;
}
int LinkStack_Judge(char a[MAXSIZE])//用链栈判断,不需考虑溢出
{
int i = 0;
LinkStack p, s;
while (a[i] != '&')
{
s = (LinkStack)malloc(sizeof(Node));
s->data = a[i];
s->next = top;
top = s;
i++;
}
if (a[i] == '&')
i++;
while (a[i] != '@')
{
if (a[i] == top->data)
{
p = top;
top = top->next;
free(p);
i++;
}
else
return 0;
}
if (a[i] == '@')
{
if (top == NULL)
return 1;
else
return 0;
}
}
int SeqStack_Judge(char a[MAXSIZE])//用顺序栈判断,需考虑溢出
{
int i = 0;
while (a[i] != '&')
{
if (s.top < MAXSIZE - 1)
{
s.data[++s.top] = a[i];
i++;
}
else
printf("overflow");
}
if (a[i] == '&')
i++;
while (a[i] != '@')
{
if (a[i] == s.data[s.top])
{
s.top--;
i++;
}
else
return 0;
}
if (a[i] == '@')
{
if (s.top == -1)
return 1;
else
return 0;
}
}
int main()
{
char a[MAXSIZE];
int c1, c2, c3;
s.top = -1;
gets_s(a, MAXSIZE);
c1 = SeqStack_Judge(a);
c2 = Seq_Judege(a);
c3 = LinkStack_Judge(a);
if (c1 && c2 && c3)//同时用上述三种方式判断
printf("是\n");
else
printf("否\n");
system("pause");
}
编译环境: Visual Studio