栈和队列也经常用到:
1、栈
(1) 顺序栈
常用操作:初始化、入栈、出栈、取得栈顶元素。
上点代码:
#define STACK_INIT_SIZE 100 //初始容量
#define STACKINCREMENT 10 //容量增量
typedef struct
{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //当前存储容量
}//SqSatck
status InitStack(SqStack &s) //初始化栈
{
s.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!s.base) exit(OVERFLOW);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack
status GetTop(SqStack s,SElemType &e) //取栈顶元素
{
if(s.top==s.base) return ERROR;
e=*(s.top-1);
return OK;
}//GetTop
status Push(SqStack &s,SElemType e) //入栈
{
if(s.top-s.base>=s.stacksize)
{
newbase=(SElemType *)malloc(s.base,(s.stack+STACKINCREMENT)*sizeof(SElemType));
if(!newbase) exit(OVERFLOW);
s.base=newbase;
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return OK;
}//Push
status Pop(SqStack s,SElemType &e) //出栈
{
if(s.top==s.base) return ERROR;
e=*--s.top;
return OK;
}//Pop
(2)双向栈(空间共享)
两个栈共享一个存储空间的好处是节省存储空间,降低上溢发生的概率。
定义方式:#define STACKSIZE 100
typedef struct{
SElemType base[STACKSIZE];
SElemType *top0,*top1; // 定义两个栈顶指针,分别指向双向栈的两端
}DuStack;
(3)链栈
定义方式:typedef struct LiStack{
SElemType data;
struck LiStack *next;
};
应用:前缀、中缀、后缀表达式
2、队列
(1)单链队列
定义:typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
(2)循环队列
头指针(记为Q.front):如果队列不空,则指向当前队首元素;
尾指针(0:如果队列不空,则指向当前队尾元素的下一个位置。
队列空的条件:Q.front=Q.rear
队列满的条件:(Q.rear+1)%maxsize=Q.front (队列实际容量 m=maxsize-1)
队列长度:(Q.rear-Q.front+MAXQSIZE)%MAXSIZE;
入队列:Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%maxsize;
出队列:e=Q.base[Q.front];
Q.front=(Q.front+1)%maxsize;