一、顺序栈
#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef int Selemtype;
typedef struct
{
Selemtype data[MAXSIZE];
int top; //栈顶
}SqStack; //顺序栈
int Push(SqStack* s, Selemtype e)
{
if (s->top == MAXSIZE - 1) //栈满
return 0;
s->top++;
s->data[s->top] = e;
return 1;
}
int Pop(SqStack* s, Selemtype& e)
{
if (s->top == -1)
return 0;
e = s->data[s->top];
s->top--;
return 1;
}
二、链栈
#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef int Selemtype;
typedef struct StackNode
{
Selemtype data;
struct StackNode* next;
}StackNode,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}LinkStack;
int Push(LinkStack* S, Selemtype e)
{
LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
s -> data = e;
s->next = S->top;
S->top = s;
S->count++;
return 1;
}
int Pop(LinkStack* S, Selemtype& e)
{
LinkStackPtr p;
if (StackEmpty(*S))
return 0;
e = S->top->data;
p = S->top;
S->top = S->top->next;
free(p);
S->count--;
return 1;
}
三、循环队列的顺序存储结构
#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef int Qelemtype;
typedef struct
{
Qelemtype data[MAXSIZE];
int front; //头指针
int rear; //尾指针,若队列不空,指向队列尾元素的下一个位置
}SqQueue; //顺序循环队列
int InitQueue(SqQueue* Q) //初始化
{
Q->front = 0;
Q->rear = 0;
return 1;
}
int Length(SqQueue Q)
{
return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
}
int EnQueue(SqQueue* Q, Qelemtype e)
{
if ((Q->rear + 1) % MAXSIZE == Q->front)//队列满
return 0;
Q->data[Q->rear] = e;
Q->rear = (Q->rear + 1) % MAXSIZE; //指针后移一位
return 1;
}
int DeQueue(SqQueue* Q, Qelemtype& e)
{
if (Q->front == Q->rear)//队列空
return 0;
e = Q->data[Q->front];
Q->front = (Q->front + 1) % MAXSIZE;//指针后移
return 1;
}
四、链式队列
#include<iostream>
using namespace std;
#define MAXSIZE 100
typedef int Qelemtype;
typedef struct QNode
{
Qelemtype data;
struct QNode* next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front, rear;
}LinkQueue; //队列的链表结构
int EnQueue(LinkQueue* Q, Qelemtype e)
{
QueuePtr s = (QueuePtr)malloc(sizeof(QNode));
if (!s)
return 0;
s->data = e;
s->next = NULL;
Q->rear->next = s; //队列尾加入新元素
Q->rear = s;
return 1;
}
int DeQueue(LinkQueue* Q, Qelemtype& e)
{
QueuePtr p;
if (Q->front == Q->rear)
return 0;
p = Q->front->next;
e = p->data;
Q->front->next = p->next;
if (Q->rear == p)
Q->rear = Q->front;
free(p);
return 1;
}