栈和队列

栈的存储结构:
①顺序栈
②链栈

一.顺序栈:

顺序栈的基本操作:

//栈的初始化
//构建一个结构体 		 
typedef int elemtype;		 //elemtype可设置为不同的类型 如inte 
typedef struct SequenStack
{
	elemtype date[MAXSIZE];//定义顺序栈为一维数组 
	int top;							 //top为栈顶指针 
}SequnStack;

//顺序栈的初始化 :构造一个空栈 
SequenStack * Init_SequenStack()
{
	Squence *S;           //顺序栈的指针变量 
	S = (SequenStack *) malloc (sizeof(Sizeof(SequenStack)));//申请空间且S指向这个空间 
	if(S == NULL) return S;  //如果申请失败就返回空指针 
	
	S->top = -1;
	return S;
}

int main()
{
  SequenStack *S;          
  S = Init_SequenStack();
  if(S == NULL) printf("申请空间失败了!");
	else
	.
	.
	.
	
	return 0;
}
---------------------------------------------------------------
//判栈空 
int SequenStack_Empty(SequenStack *S)
{
	if(S->top == -1) return 1;
	else return 0;
}
//判栈满 
int SequenStack_Full(SequenStack *S)
{
	return (S->top+1);
}

//入栈
int Push_SequenStack(SequenStack *S, elemtype x)
{
	if(S->top >= MAXSIZE-1) return 0;//满了吧,插入失败	
	S->top++;
	S->date[S->top] = X;
	return 1;                        //插入成功 返回x 
} 
//出栈
int Pop_SequenStack(SequenStack *S, elemtype x)//这x相对于打工人 
{
	if(S->top == -1) return 0;     //都空了,删除失败 
	S->top--;											 
	//相当于删除,其实没有删 -_-但是重新入栈会覆盖它				
	*x = S->date[S->top+1];        //把原栈顶元素赋值给x,然后输出它 
	return 1;                      //删除成功 返回x 
}

二.链栈:

//链栈的定义 
typedef struct
{
	int date;
	struct LinkStackNode * next;
}LinkStackNode, LinkedStack;
LinkedStack top;

//链栈初始化 
LinkedStack Init_LinkedStack()
{
	LinkedStack top = (LinkedStackNode *) molloc (sizeof(LinkedStackNode));
	if(top != NULL) top->next = NULL;
	return top;
}

//入栈
int push(LinkedStack top, int x)
{
	LinkedStackNode *node;	
	node = (LinkedStackNode *) malloc (sizeof(LinkedStackNode));
	
	if(node == NULL) return 0;//申请空间失败 
	else
	{
		node->date = x;
		node->next = top->next;
		top->next = node;
		return 1;
	}
} 

//出栈
int pop(LinkedStack top) 
{
	int x;
	LinkedStackNode *node;
	if(top->next == NULL) return 0;
	else
	{
		node = top->next;
		x = node->date;
		top->next = node->next;
		free(node);
		printf("%d\n", x); 
		return 1;
	}
}

//判空
int empty(LinkedStack top) 
{
	if(top->next == NULL) return 1;
	else  return 0;
}

队列:先进后出

队列的储存结构:
①顺序存储结构:用数组->顺序队列 优化后变为更好用的 循环队列
②连式储存结构:用链表->链队列

队列可用stl里的 queue < int> q 很好用!

循环队列

//循环队列的定义 
typedef struct SequenQueue 
{
	int date[MAXSIZE];
	int front;
	int rear; 
}SequenQueue;

//循环队列的初始化
SequenQueue *INIT_SequenQueue()
{
	SequenQueue *Q;
	Q = (SequenQueu *) malloc (sizeof(SequenQueue));
	if(Q != NULL)
	{
		Q->front = 0;
		Q->rear  = 0;	
	}
	return Q;//返回循环队列的首地址 
} 

//判队满 牺牲一个空间来确定是否堆满
int full(SequenQueue *Q)
{
	if((Q->rear+1)%MAXSIZE == Q->front) return 1;//队满
	else return 0;		 
}

//判对空 
int empty(SeqeunQueue *S)
{
	if(S->front == Q->rer) return 1;
	else return 0;	
} 

//入队
int Enter(SequenQueue *Q, int x)
{
	if(full(Q)) return 0;//队列满了
	Q->date[Q->rear] = x;//插入x 
	Q->rear = (Q->rear+1) % MAXSIZE;//尾指针+1 
	return 1; 
} 

//出队
int Delete(SequenQueue *Q)
{
	if(Q->front == Q->rear) return 0;//队列为空出队失败	
	else
	{
		x = Q->date[Q->front];
		Q->front = (Q->front+1) % MAXSIZE;//front+1
		return 1; 
	}
}

这里有个队列的题目
它是直接类似队列的东西来做的
不想我搞了一大堆的结构题链表啥的
所以做题还是要避繁趋简!
题目:海港
题解:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<string>
using namespace std;
int book[100001],a[300002],queue[300002];//队列
int main()
{
	int n,t,k,head=0,country=0,tail=0;	//定义一大堆...
	cin>>n;
	for (int i=1;i<=n;++i)
	{
		cin>>t>>k;
		for (int j=1;j<=k;++j)
		{
			queue[++tail]=t;	//用队列储存时间!!!
			cin>>a[tail];//输入
			if(book[a[tail]]++==0)
				++country;	//如果以前没有这个国籍,则给国籍总数加1
		}
		while (t-queue[head]>=86400)//重要部分:如果第一个人到达的时间已经大于当前时间
			if(--book[a[head++]]==0)//跳到下一个人,如果这个人是一个国籍的唯一一个人
				--country;	//暂且不再有这个国籍
		cout<<country<<endl;	//输出
	}
	return 0;
}

链式队列

//定义
typedef struct QueueNode
{
	int date;
	struct QueueNode *next; //指向下个结点的指针 
} LinkedQueueNode;				//链队列结点的结构类型 
typedef struct LQueue
{
	LinkedQueueNode *front; //对头指针 
	LinkedQueueNode *rear;	//队尾指针 
}LQueue, *LinkedQueue;		//链队列的结构类型 

//初始化
LinkedQueueNode Init_LinkQueue()
{
	LinkedQueue Q = (LinkedQueue) malloc (sizeof(LQueue));
	LinkedQueueNode * head = (LinkedQueueNode *) malloc (sizeof(LinkedQueueNode));
	
	if(head!=NULL && Q!=NULL)
	{
		head->next = NULL;
		Q->front = head;
		Q->rear  = head;
	}
	return Q;
}

//判空
int empty(LinkedQueue Q)
{
	if(Q->front == Q->rear) return 1;
	else return 0;	
}

//入队
int Enter(LinkedQueue Q, int x)
{
	LinkedQueueNode * node;
	node = (LinkedQueueNode *) malloc (sizeof(LinkedQueueNode));
	if(node == NULL) return 0;
	
	node->date = x;       //设置新结点的数据域赋值 
	node->next = NULL;		//设置新结点的指针域为空 
	Q->rear->next = node;	//将新结点插入队尾 
	Q->rear = node;				//设置设置尾指针指向新的队尾元素 
	return 1;
}

//出队 
int Delete(LinkedQueue Q)
{
	int x;
	LinkedQueueNode * node;
	if(Q->front == Q->rear) return 0;//队列为空
	else
	{
		node = Q->front->next;      //node指向原队顶元素 
		x = node->date;							//将原队顶元素的数组赋值给 x 
		Q->front->next = node->next;//头指针Q移动到下一个结点 
		因为第一个结点是不存如何数据的头节点
		if(node == Q->rear)         //若队列仅只有一个数据元素,置队列为空 
			Q->rear = Q->front;				
		free(node);									//释放出队元素 
		return 1;	
	} 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值