- 假设I、O分别表示入栈、出栈操作,栈的初态和终态均为空,入栈和出栈的操作序列表示为仅由I和O组成的序列,可以操作的序列称为合法序列,否则称为非法序列,设计一算法,判断所给的操作序列是否合法
int Judge(char A[]){
// 逐一扫描入栈出栈序列,每扫描至一个元素,检查出栈次数是否小于入栈次数,若大于则为非法序列
// 结束后,再判断出入栈的顺序是否相等,相等则合法
int i = j = k = 0;
while(A[i] != '\0'){
switch(A[i]){
case 'I':
j++;
break;
case 'O':
k++;
break;
}
if(k > j){
cout << '序列非法' << endl;
return 0;
}
i++;
}
if(j != k){
cout << '序列非法' << endl;
return 0;
}else{
cout << '序列合法' << endl;
return 1;
}
}
- 设单链表表头指针为L,结点结构由data喝next两个域组成,其中data域为字符型。试设计算法判断该链表的全部n个字符是否对称。例如xyx、xyyx都是中心对称
int judge(Linklist L, int n){
char s[n/2]; // 字符栈
p = L->next;
for(i = 0; i < n/2; i++){
s[i] = p->data;
p = p->next;
}
i--;
if(n % 2 == 1){
p = p->next;
}
while(p != NULL && s[i] == p->data){
p = p->next;
i--;
}
if(i == -1){
return 1;
}else{
return 0;
}
}
- 设有两个栈s1、s2都采用顺序栈方式,并且共享一个存储区[0, ..., maxsize - 1],尽量利用空间,减少溢出可能,采用栈顶相向,迎面增长的存储方式。试设计s1、s2有关入栈和出栈的操作算法。
#define maxsize 1