栈、队列相关
//栈的结构体
typedef struct{
char data[maxsize];
int top;
}stack;
//队列的结构体
typedef struct{
int data[maxsize];
int front,rear;
}queue;
//
//Q是一个队列,S是一个人空栈,编写算法使队列中元素逆置
void reverse(stack &s,queue &q){
while(q.front!=q.rear)
push(s,dequeue(q));
while(s.top!=-1)
enqueue(q,pop(s));
}
//
//判断单链表的全部n个字符是否中心对称
int fun(LNode *L){
int n=0,j;
stack s;
Init(S);
LNode *p=L->next;
while(p!=NULL){
++n;
p=p->next;
}
p=L->next;
for(j=0;j<n/2;++j){
push(s,p->data);
p=p->next;
}
if(n%2!=0)
p=p->next;
while(p!=NULL)
if(popo(s)==p->data)
p=p->next;
else
return 0;
}
return 1;
//
//两个栈s1,s2都采用顺序存储,并共享一个存储区[0,...,maxsize-1]
//采用栈顶相向,迎面增长的存储方式,设s1,s2入栈和出栈的操作
bool push(stack &s,int i,int x){
if(i<0 || i>1)
return false;
if(s.top[1]-s.top[0==1)
return false;
switch(i){
case 0:
s.data[++s.top[0]]==x;
break;
case 1:
s.data[--s.top[1]]=x;
break;
}
return true;
}
int pop(stack &s,int i){
if(i<0||i>1)
return -1;
switch(i){
case 0:
if(s.top[0]==-1)
return -1;
else
return s.data[s.top[0]--];
break;
case 1:
if(s.top[1]==maxsize)
return -1;
else
return s.data[s.top[1]++];
break;
}
return 0;
}
//
//判断一个表达式中括号是否配对(假设只包含圆括号)
bool fun(stack &s,string str){
int i=0;
while(str[i]!='\0'){
switch(str[i]){
case'(':
push(s,'(');
break;
case')':
if(pop(s)!='(')
return false;
break;
}
++i;
}
if(s.top==-1)
return true;
else
return false;
}
//
//假设一个序列为HSSHHHS,运用栈的知识,编写算法将S全部提到H之前,即为SSSHHHH
void fun(string S){
stack s;
Init(s);
string newS="";
int i=0,j=0;
while(s[i]!='\0'){
if(s[i]=='H')
push(s,S[i++]);
else
newS[j++]=S[i++];
}
while(s.top!=-1)
newS[j++]=pop(s);
i=0;
while(newS[i]!='\0')
printf("%d",newS[i++]);
}
补充双链相关内容
typedef struct DNode{
Elemtype data;
struct DNode *prior,*next;
}DNode,*DLinklist;
//插入
s->next=p->next;
p->next->prior=s;
s->prior=p;
p->next=s;
//删除
p->next=q->next;
q->next->prior=p;
free(q);