3.判定栈操作序列是否合法
依次逐一扫描入栈出栈序列,每扫描至任一位置均需检查出栈次数是否小于入栈次数,若大于则为非法序列。扫描结束后,再判断入栈和出栈次序是否相等,若不相等则不合题意。
bool Judge(char A[]){
int i=0; //用来遍历
int j=k=0;
while(A[i]!='\0'){
switch(A[i]){
case 'I': j++; break;
case 'O': k++;
if(k>j) {
printf("序列非法\n");
exit(0);
}
}
i++;
}
if(j!=k){
printf("序列非法\n");
return false;
}
else{
printf("序列合法\n");
return true;
}
}
4.单链表n个结点,头指针L,存储字符型数据,判断字符是否对称。
使用栈来判断链表中的数据是否中心对称。让链表的前一半元素依次进栈。在处理链表的后一半元素时,当访问到链表的一个元素后,就从栈中弹出一个元素,两个元素比较,若相等,则将链表中的下一个元素与栈中再弹出的元素比较,直至链表到尾。这时若栈时空栈,则得出链表中心对称的结论;否则,当链表中的一个元素与栈中弹出元素不等时,结论文链表非中心对称,结束算法的执行。
bool dc(Linklist L,int n){
int i;
char s[n/2];
Lnode *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){
i--;
p=p->next;
}
if(p==NULL) return true;
else return false;
}
5.两个顺序栈共享0-Maxsize-1的存储区,请设计s1 s2有关出入栈的操作
两个栈共享向量空间,将两个栈的栈底设在向量两端,初始时,s1栈顶指针为-1,s2栈顶指针为Maxsize,两个栈顶指针相邻时为栈满。两个栈顶相向,迎面增长,栈顶指针指向栈顶元素。
#define Maxsize 100
#define elementype int
typedef struct {
elementype stack[Maxsize];
int top[2];
}stk;
stk s;
int push(int i,elementype x){ //i时栈号
//入栈成功返回1,否则返回0
if(i<0||i>1){
printf("输入栈号不对");
exit(0);
}
if(s.top[1]-s.top[0]==1){
printf("栈满");
return 0;
}
switch(i){
case 0: s.stack[++s.top[0]]=x;
return 1;break;
case 1: s.stack[--s.top[1]]=x;
return 1;
}
}
int pop(int i){
//出栈成功返回栈顶元素,否则返回-1
if(i<0||i>1){
printf("输入栈号不对");
exit(0);
}
switch(i){
case 0:
if(s.top[0]==-1){
printf("栈空");
return -1;
}
else return s.stack[s.top[0]--];
case 1:
if(s.top[1]==Maxsize) {
printf("栈空");
return -1;
}
else return s.stack[s.top[1]++];
}
}
天勤
9、编写算法将非负十进制N转换为二进制
void transform(int N){
int i,result=0;
int stack[maxSize],top=-1;
while(N!=0){
i=N%2;
N=N/2;
stack[++top]=i;
}
while(top!=-1){
i=stack[top];
--top;
result=result*10+i;
}
return result;
}
10、判断括号是否配对,push pop isEmpty可以直接使用
bool BracketCheck(char str*){
Initstack(s);
int i=0;
while(str[i]!='\0'){
switch(str[i]){
case '(': push(s,'(');break;
case '{': push(s,'{');break;
case '[': push(s,'[');break;
case ')': pop(s,x);if(x!='(') return false;break;
case '}': pop(s,x);if(x!='{') return false;break;
case ']': pop(s,x);if(x!='[') return false;break;
default: break;
}
i++;
}
if(!isEmpty(s)){
printf("括号不匹配");
return false;
}
else{
printf("括号匹配");
return true;
}
}