一、栈的增删改查
#define StackSize 100
#define DataType int
typedef struct Stack{
DataType array[StackSize];
int top;
}Stack;
1、栈初始化
Stack * StackInit(){
Stack * stack = (Stack*)malloc(sizeof(Stack));
if(stack == NULL)
return -1;
stack->top = -1;
return stack;
}
2、栈销毁
void StackDestroy(Stack* stack){
stack->top = 0;
}
3、压栈
bool PushStack(Stack * stack){
DataType data = 0;
if(stack->top == StackSize-1)
return false;
scanf("%d",data);
stack->top++;
stack->array[stack->top] = data;
return true;
}
4、弹栈
bool PopStack(Stack * stack,DataType* data){
if(stack->top == -1)
return false;
*data = stack->array[stack->top];
stack->top--;
return true;
}
5、返回栈顶的元素
bool topStack(Stack * stack,DataType* data){
if(stack->top == -1)
return false;
*data = stack->array[stack->top];
return true;
}
6、返回栈内数据个数
int StackNum(Stack * stack){
int Number = 0;
if(stack->top == -1)
return 0;
Number = stack->top;
return Number;
}
7、判断栈是否为空
int StackEmpty(Stack * stack){
if(stack->top == -1)
return true;
return false;
}
二、队列的增删改查
队列是在队尾进行插入,对头进行删除。。
下面都是在以链式队列进行介绍
首先在结构体中定义链式队列的队头和队尾,前提是得先定义一个和链表的节点一样的结构体,包含数据域和指针域。
#define DataType int
typedef struct QNode
{
QElemType Data;
struct QNode * Next;
}QNode;
typedef struct LQueue
{
QNode *Front;
QNode *Rear;
}LQueue;
1、创建新节点
首先申请一块动态内存,强制转换为QNode类型的结构体指针。然后把传入的数据进行赋值,Next先赋值为NULL。因为每次都是在队尾插入所以队尾后面没有可以指向的元素,就先赋值为NULL。
static QNode *CreateLQNode(DataType data){
QNode *LQNode = (QNode *)malloc(sizeof(QNode));
if(LQNode == NULL){
printf("Create a Node failed\n");
assert(LQNode);
}
LQNode->Data = data;
LQNode->Next = NULL;
return LQNode;
}
2、初始化队列
让队列的队头和队尾指向空。
void LQueueInit(LQueue *Queue){
assert(Queue);
QNode* QHead = CreateLQNode(0);
Queue->Front = Queue->Rear = QHead;
Queue->Front->Next = NULL;
}
3、判断队列是否为空
int IsEmpty(LQueue *Queue)
{
if(Queue->Front->Next == NULL)
{
return 1;
}
return 0;
}
4、入队列
void EnterLinkQueue(LQueue *Queue,DataType data){
QNode *Node = CreateLQNode(data);
Queue->Rear->Next = Node;
Queue->Rear = Node;
}
5、出队列
void DeleteLinkQueue(LQueue *Queue,DataType *data){
if(IsEmpty(Queue)){
printf("队列为空\n");
return;
}
QNode*Del_Node = Queue->Front->Next;
*data = Del_Node->Data;
Queue->Front->Next = Del_Node->Next;
if(Queue->Rear == Del_Node)
Queue->Rear = Queue->Front;
free(Del_Node);
}
6、取队头元素
int GetHead(LQueue *Queue,DataType *data){
if(IsEmpty(Queue)){
printf("队列为空\n");
return;
}
QNode *Node;
Node = Queue->Front->Next;
*data = Node->Data;
return *data;
}
7、清空队列
void ClearQueue(LQueue *Queue){
LQueue *p,*q;
Queue->Rear = Queue->Front;
p = Queue->Front->Next;
q = p;
while(p != NULL){
free(p);
p = q->Next;
q = p;
}
}
8、打印队列中的元素
void PrintQueue(LQueue*Queue){
assert(Queue);
QNode * Node = Queue->Front->Next;
while(Node){
printf("%3d",Node->Data);
Node = Node->Next;
}
printf("\n");
}
|