数据结构(二) 栈、队列、递归

1.用数组实现一个顺序栈

//用数组实现一个顺序栈
#define maxsize 64  //栈的最大容量 
typedef struct
{
	datatype data[maxsize];  //栈的存储空间 
	int top;  //栈顶指针 
}sqstack, *sqslink;  //顺序栈说明符

//置栈空
void Clearstack(sqslink s)
{
	s->top = -1;  //用指针值为-1表示栈空 
} 
//判栈空
int Emptystack(sqslink s)
{
	if(s->top < 0) return (1);  //栈空返回1 
	else return (0);  //栈非空返回0 
} 
//元素x进栈
int Push(sqslink s, datatype x)
{
	if(s->top >= maxsize-1) return(0);  //栈满溢出 
	else{
		s-top++;   //移动栈顶指示器
		s->data[s->top] = x;  //x进栈 
		return (1);
	}
}
//出栈
datatype Pop(sqslink s)
{
	if(Emptystack(s)) return (NULL);  //栈空返回NULL 
	else
	{
		s->top--;
		return (s->data[s->top+1]);  //弹出栈顶元素 
	}
} 
//取栈顶元素
datatype Getstop(sqslink s)
{
	if(Emptystack(s)) return (NULL);  //栈空返回NULL 
	else return(s->data[s->top])  //返回栈顶元素 
}

2.用链表实现一个链式栈

//用链表实现一个链式栈

typedef struct node
{
	datatype data;  //存储一个栈元素 
	struct node *next;  //后继指针 
}snode, *slink;
//置栈空
Lclearstack(slink top)
{
	top = NULL;
}
//判栈空否
int Lemptysatck(slink top)
{
	if(top == NULL) return(1);
	else return (0);
}
//进栈
Lpush(slink top, datatype e)
{
	slink p;
	p = (slink)malloc(sizeof(snode));  //生成进栈的p节点 
	p->data = e;  //存入元素e 
	p->next = top;  //p节点作为新的栈顶节点 
	top = p;
} 
 
//出栈
datatype Lpop(slink top)
{
	datatype e;
	slink p;
	if(Lemptystack(top)) return(NULL);  //栈空返回 
	else
	{
		e = top->data;  //取栈顶元素
		p = top; top = top->next;   //重置栈顶元素
		free(p); return (e); 
	}
 } 

3.编程模拟实现一个浏览器的前进、后退功能

队列

1.用数组实现一个顺序队列

//用数组实现一个顺序队列
typedef struct
{
	datatype data[maxsize];  //队列的存储空间 
	int front, rear;  //队头,队尾指针 
}squeue, *squlink;

2.用链表实现一个链式队列

//用链表实现一个链式队列
typedef struct node  //节点类型 
{
	datatype data;
	struct node *next;
}Qnode, *Qlink;

typedef struct  //q节点结构 
{
	Qnode *front, *rear;
}linkqueue;
//创建队列 
void Lcreatqueue(linkqueue *q)
{
	q->front = (Qlink)malloc(sizeof(Qnode));  //申请头节点 
	q->front->next = NULL;  //置队空 
	q->rear = q->front;
 }
//判队空 
int Lemptyqueue(linkqueue *q)
{
	if(q->front == q->rear) return(1);
}
//元素e进队的算法
void Lenqueue(linkqueue *q, datatype e)
{
	Qlink p;
	p = (Qlink)malloc(sizeof(Qnode));  //申请进队节点 
	p->data = e;  //存入元素e 
	p->next = NULL;
	q->rear->next = p; q->rear = p;
 } 
//出队
datatype Ldequeue(linkqueue *q)
{
	Qlink p;
	if(Lemptyqueue(q)) return(NULL);  //队空处理 
	else
	{
		p = q->front;
		q->front = p->next;  //将队头元素提前至节点 
		free(p);
		return (q->front->data);  //返回被提前至头节点的原队头元素值 
	}
 } 

3.实现一个循环队列

//实现一个循环队列

//置队空 
void ClearQueue(squlink Q)
{
	Q->front = Q->rear = 0;
}
//判队空
int EmptyQueue(sqlink Q)
{
	if(Q->front == Q->rear) return(1);  //队空返回1 
	else return (0);  //队非空返回0 
}
//元素e进队
int EnQueue(squlink Q, datatype e)
{
	if((Q->rear + 1)%maxsize == Q->front)
	{
		ERROR(Q);
		return (0);
	}
	else
	{
		Q->rear = (Q->rear + 1)%maxsize;
		Q->data[Q->rear] = e;
		return (1); 
	}
}
//出队
datatype DeQueue(squlink Q)
{
	if(EmptyQueue(Q)) return(NULL);
	else
	{
		Q->front = (Q->font + 1)%maxsize;
		return (Q->data[Q->front]);
	}
}
//求队Q中当前元素个数
int Lenqueue(squlink Q)
{
	int i;
	i = (Q->rear - Q->front + maxsize)%maxsize;
	return(i);
 }

递归

1.编程实现斐波那契数列求值 f(n)=f(n-1)+f(n-2)

//编程实现斐波那契数列求值 f(n)=f(n-1)+f(n-2)
void Fibonacci(int Fib[n])
{
	int i;
	for(int i = 0; i < n; i++)
		Fib[i] = Fib-i(i);
}
int Fib-i(int i)
{
	if(i == 0) return(0);
	else if(i == 1) return(1);
	else return(Fib-i(i - 1) + Fib-i(i - 2));
}

2.编程实现求阶乘 n!

//编程实现求阶乘 n!
int Fact(int n)
{
	if(n==0) return(1);
	else return(n*Fact(n - 1));
}

3.编程实现一组数据集合的全排列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值