# 结构之美学习二《栈和队列》

1.栈的数组结构实现，也就是栈顺序存储结构定义。

typedef struct
{
ElemType data[MAX_SIZE];
int top;
}SqStack;

Status push(SqStack * s, ElemType e)
{
if(s->top == MAX_SIZE-1);//栈已经满了
return error;
//入栈
s->top++;
s->data[s->top] = e;
return ok;
}

Status pop(SqStack * s, ElemType *e){
if(s->top ==-1)
return error;
*e = s->data[s->top];
s->top--;
return ok;
}

Status Push(SqStack * s, ElemType e, int stackNumber)
{
if(s->top1+1 == s->top2);
return error;
if(stackNumber == 1)
{
s->data[++s->top1] = e;
}
else if(stackNumber == 2)
{
s->data[--s->top2] = e;
}
return ok;
}

2.栈的链式实现。

typedef struct StackNode
{
ElemType data;
struct StackNode *next;

{
int count;//元素个数
}

Status push(LinkStack * ls,ElemType e)
{
l->data = e;//赋值
l->next = ls->top;
ls->top = l;
ls->count++;
return ok;
}

Status pop(LonkStack * ls ,ElemType *e)
{
if(ls->count == -1)
return error;
//*e = ls->top;
h = ls->top
ls->top = p->next;
free(h)
ls->count--;
return ok;

}

int Fbi(int i){
if(i<2)
return i == 0?0:1
return Fbi(i-1)+Fbi(i-2);
}

private  Map numsMap = new HashMap<Integer,Integer>();
public  int Fbi(int i){
int x,y;
if(i<2)
return i == 0?0:1;
if(numsMap.get(Integer.valueOf(i-1)) !=null){
x = (Integer) numsMap.get(Integer.valueOf(i-1));
}else{
x=Fbi(i-1);
}
if(numsMap.get(Integer.valueOf(i-2)) !=null){
y = (Integer) numsMap.get(Integer.valueOf(i-2));
}else{
y=Fbi(i-2);
}
return x+y;
}

栈另外一个重要的的应用：四则运算表达式求值。
1.后缀表示法，（逆波兰）:简单说就是遇到数字就进栈，遇到符号就栈顶两个数字出栈。
2.中缀表达式也就是我们平常书写的四则运算表达式。

1.队列顺序存储结构

typedef struct{
ElemType data[MAX_SIZE];
int front;
int rear;
}SqQueue;

Status EnQueue(SqQueue *Q,ElemType e){
if((Q->rear -Q->front +MAXSZIE)%MAXSIZE ==Q->front)
return error;
Q->data[Q->rear] = e;
Q->rear = (Q->rear+1)%MAXSZIE;
return ok;
}

Status DeQueue(Sqqueue *Q,ElemType *e){
if(Q->rear ==  Q->front)
rerurn error;

*e = Q- >data[Q->front];
Q->front = (Q->front+1)%MAXSIZE;
return ok;
}

2.队列的链式存储实现

链队列的结构
typedef int Elemtype ；
typedef struct QNode{
ElemType data；
struct QNode  *next；
}QNode，*QueuePtr；

typedef struct{//队列的链表结构
Queueptr front,rear;

}LinkQueue；

Status EnQueue(LinkQueue * Q , ElementType e)
{
Queueptr p = (Queueptr) malloc(sizeof(QNode));

if(!s)//分配失败；
exit(OVERFLOW);

p->data = e ;
P->next = NULL;
Q->rear->next = p ;//在队尾插入
Q->rear = s ;//将p作为队尾节点
return ok ;
}

Status DeQueue(LinkQueue * Q , ElementType *e)
{
Queueptr p ;
if( Q-> front == Q-> rear) //空队列
return error;
p = Q->front->next;//保存要删除的元素
*e = p->data;
Q->front->next = p->next;
if(Q->rear == p)//若队头是队尾，删除后将队尾指向队头
Q->rear = Q->front;
free(p);
eturn ok;
}

• 本文已收录于以下专栏：

举报原因： 您举报文章：结构之美学习二《栈和队列》 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)