数据结构-栈

hhh,作者太懒了,本来决定每周更好像没有做到。把所有栈有关的代码都栈在这个贴子了。之后也不会像以前一样分的那么细了。

总而言之,栈有两种实现方式-顺序栈和链栈。栈先进先出,其栈顶和栈底的概念是我们必须要理解的。栈的共享技术也非常有意思。

#include<stdio.h>
#include<stdlib.h>

//LIFO-后进先出,Top栈顶;Bottem栈底 
//ADT stack{
//	数据元素:必须是属于同一个数据对象
//	结构关系:栈中地数据元素之间是线性关系
//	基本操作:InitStack(S);ClearStack(S);IsEmpty(S);IsFull(S);Push(S, x);Pop(S, x); GetTop(S, x); 
//}ADT stack; 

//顺序栈-需要top栈顶指针动态指示栈顶元素位置(top=-1表示空栈)

#define Stack_Size 50
#define StackElementType char

#define TRUE 1
#define FALSE 0 
typedef struct{
	StackElementType elem[Stack_Size];
	int top;
}SeqStack; 

//初始化顺序栈-构造一个空栈 
void InitStack(SeqStack *S)
{
	S->top = -1;
 } 

//把x置入新栈栈顶 
int Push(SeqStack *S, StackElementType x)
{
	if(S->top == Stack_Size - 1) return (FALSE);//栈已满
	else{
		S->top++;
		S->elemm[S->top] = x;
		return (TRUE);
	}
}

//弹出栈顶元素并保存 
int Pop(SeqStack *s, StackElementType *x)
{
	if(S->top == -1)	return (FALSE);//栈空
	else{
		*x = S->elem[S->top];
		S->top--;
		return (TRUE); 
	}
 } 
 
 //读栈顶元素,与pop比S->top不用改 
int GetTop(SeqStack *S, StackElementType *x)
{
	if(S->top == -1)	return (FALSE);//栈空
	else{
		*x = S->elem[S->top];
//		S->top--;
		return (TRUE); 
	}
}
#include<stdio.h>
#include<stdlib.h>

#define M 100
//多栈共享技术-双端栈(栈底位置不变,而栈顶位置动态变化)

#define ElementType int
#define FLASE 0
#define TRUE 1 
typdef struct{
	StackElementType Stack[M];
	int top[2]; //
}DqStack;

//双端顺序栈初始化 
void InitStack(DqStack *S)
{
	S->top[0] = -1;
	S->top[1] = M;	
}

//进栈操作(左边0号栈,右边1号栈)
int Push(DqStack *s, StackElementType x, int i)
{
	if(S->top[0] + 1 == S->top[1]) return (FALSE);//双端栈已满 
	switch(i){
		case 0:{
			S->top[0]++;
			S->StackElementType[S->top[0]] = x;
			break;
		}
		case 1:{
			S->top[1]--;
			S->StackElementType[S->top[1]] = x;
			break;
		}
		default: return (FALSE);
	}
	return (TRUE);
 } 

int main()
{
	return 0;
 } 
#include<stdio.h>
#include<stdlib.h>
//队列Queue-FIFO-先进显出;允许插入的一端叫队尾Rear,允许删除的一端叫队头Front
//队列的基本操作:InitQueue(Q), IsEmpty(Q), IsFull(Q), 
//EnterQueue(Q,x), DeleteQueue(Q, x), GetHead(Q, x), ClearQueue(Q) 

//下面来实现链队列

typedef struct Node{
	QueueElementType data;
	struct Node *next; 
}LinkQueueNode; 

typedef struct{
	LinkQueueNode *front;
	LinkQueueNode *rear;
}LinkQueue;

//链队列初始化
int InitQueue(LinkQueue *Q)
{
	Q->front = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
	if(Q->front!=NULL){
		Q->rear = Q->front;
		Q->front->next = NULL;
		return (TRUE);
	}
	else return (FALSE);
 } 
 
//链队列入队操作算法-从队尾入队 
int EnterQueue(LinkQueue *Q, QueueElementType x)
{
	LinkQueueNOde *NewNode;
	NewNode = (LinkQueueNode *)malloc(sizeof(LinkQueueNode));
	if(NewNode!=NULL)
	{
		NewNode->data = x;
		NewNode->next = NULL;
		Q->rear->next = NewNode;
		Q->rear = NewNode;
		return (TRUE); 
	}
	else return (FALSE);
 } 

//链队列出队-队头元素出队 
int DeleteQueue(LinkQueue *Q, QueueElementType *x)
{
	LinkQueueNode *p;
	if(Q->front == Q->rear) return (FALSE); //空队
	p = Q->front->next;
	Q->front->next = p->next; //队头元素p出队
	if(Q->rear == p) //如果队中只有一个元素p,p出队后为空队
		Q->rear = Q->front;
	*x = p->data;
	free(p);
	return (TRUE); 
 } 
 
int main()
{
	return 0;
 } 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值