2021/09/28
今天把数据结构中的栈和队列整理了一下,代码和书上有一点不一样,但都是下午自己打的也验证过的,也算有自己的理解了吧。等会把大物写了,再复习会离散,就这样吧。。
栈
顺序栈:
#define MAXSIZE 100
typedef struct
{
SElemType *base;//尾指针
SElemType *top;//头指针
int stacksize;
}Stack;
进栈:先压后加,是top指针一直指向最后数据的后一位
出栈:先减后出
void InitStack(SqStack &S)
{
S.base = new SElemType[MAXSIZE];//开辟空间
S.top = S.base ;
S.stacksize = MAXSIZE;
}
void Push(Stack &S)
{
if(S.top-S.base==S.stacksize) return ;//先判断是否栈满
cin>>*S.top;
S.top++;
}
void Pop(Stack &S)
{
if(S.top==S.base) reuturn ;//判断栈空
S.top--;
cout<<*S.top;
}
***********************************************************
-----------------------------------------------------------
***********************************************************
链栈:无头节点,直接将头指针一端作栈顶
typedef struct StackNode
{
ElemType data;
struct StackNode *next;
}StackNode,*LinkStack;
void InitStack(LinkStack &S)
{
S=NULL;//直接将头指针指向NULL,如果S->next=NULL,则当前S为头节点,则不为空
}
void Push(LinkStack &S)//头插法插入
{
LinkStack p = new StackNode;
cin>>p->data;
p->next=S;
S = p;
}
void Pop(LinkStack &S)//出栈
{
while(S)//当S=NULL时,把链栈中所有数据输出
{
cout<<S->data;
LinkStack p =S;
S=S->next;
delete p;
}
if(S==NULL) return ;//将当前头指针指向的数据输出
cout<<S.data;
LinkStack p = S;
S=S->next;
delete p;
}
***********************************************************
-----------------------------------------------------------
***********************************************************
队列
顺序队列
#define MAXSIZE 100
typedef struct
{
QElemType *base;
int front;//头指针
int rear;//尾指针
}SqQueue;
//队空:Q.front==Q.rear;
//队满:(Q.rear+1)%MAXSIZE==Q.front;
少用了一个元素空间,否则当队空和队满时都满足Q.front==Q.rear;
void InitQueue(SqQueue &Q)
{
Q.base = new QElemType[MAXSIZE];
Q.front = Q.base = 0;//将头尾指针置0,队列为空
}
int QueueLength(SqQueue Q)
{
return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;//防止当是循环队列时,返回负数
}
void EnQueue(SqQueue &Q)//用尾插,先进先出,先压后加
{
if((Q.rear + 1)%MAXSIZE==Q.front) return ;//判断是否队满
cin>>Q.base[Q.rear];
Q.rear = (Q.rear+ 1)%MAXSIZE;
}
void DeQueue(SqQueue &Q)//先出后加
{
if(Q.front ==Q.rear) return ;
cout<<Q.base[Q.front];
Q.front = (Q.front + 1)%MAXSIZE;
}
***********************************************************
-----------------------------------------------------------
***********************************************************
链队:有头节点
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;//队头指针
QueuePtr rear;//队尾指针
}LinkQueue;
将两个队列指针合并,传参时只需定义一个LinkQueue对象,就可以调用队列指针
void InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=new QNode;//将两指针同时指向头节点
Q.front->next=NULL;
}
void EnQueue(LinkQueue &Q)//尾插
{
QueuePtr p = new QNode;
cin>>p->data;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
void DeQueue(LinkQueue &Q)
{
/*
*输出一个
*/
if(Q.front==Q.rear) return ;//判断栈是否空
QueuePtr p = Q.front->next;
cout<<p->data;
Q.front->next = p->next;
if(Q.rear==p) Q.rear = Q.front;//当最后一个元素被删时,尾指针指向头指针
delete p;
或
/*
*全部输出
*/
QueuePtr p;
while(Q.front!=Q.rear)
{
p = Q.front->next;
cout<<p->data;
Q.front->next=p->next;
if(p==Q.rear) break;
else delete p;
}
Q.rear=Q.front;//将尾指针指向头
delete p;//此时队列中只有头节点
}
浙公网安备 33010602011771号