考研数据结构---线性表---栈

1.栈是一种线性表,主要特点就是只允许在一端进行插入或删除操作的线性表。
2.栈顶:(top)线性表允许进行插入和删除的一端
栈底:(bottom) 是固定的,不允许进行插入和删除的一端

一、栈的顺序存储实现

采用顺序存储的栈被称为“顺序栈”,通常顺序存储结构由一个“一维数组”和一个记录“栈顶”元素位置的变量组成。
1.结构定义

 #define MaxSize 100
typedef int Elemtype;
//顺序栈的结构
typedef struct {
	Elemtype data[MaxSize];			//存放栈中的元素
	int top;			//栈顶指针
}SequenStack;

SequenStack S;

栈顶指针:S.top ,初始时设置S.top=-1;
栈顶元素:S.data[S.top];
进栈操作(Push):栈不满时,栈顶指针先加1,再送值到栈顶元素
出栈操作(Pop):栈非空时,先取栈顶元素值,再将栈顶指针减1。
栈空条件:S.top==-1;
栈满条件:S.top==MaxSize-1;

2.初始化

void InitStack(SequenStack &S)		//使用&可以修改传入的S栈的内容
{
	S.top = -1;
}

3.判断栈是否为空

bool StackEmpty(SequenStack S)
{
	if (S.top == -1) {	//栈空
		return true;
	}
	else {
		return false;	//不空
	}
}

4.Push入栈操作

bool Push(SequenStack &S, Elemtype x)
{
	if (S.top == MaxSize - 1)	//栈满,报错
	{
		return false;
	}
	//先让top加1然后给加1后的地址位置附上x值
	//相当于 S.top++; S.data[S.top]=x;
	S.data[++S.top] = x;	
	return true;
}

5.Pop出栈操作
第一种是修改参数x的值

bool Pop(SequenStack &S, Elemtype &x)		
{
	if (S.top == -1)		//栈空
		return false;
	//将出栈的值给x,然后top减1
	x=S.data[S.top--];
	return true;	//虽然返回的是bool类型,但是参数中x是地址,那么在Pop函数中修改x可以在程序中输出
}

第二中是返回的值是出栈的值

Elemtype Pop(SequenStack &S)
{
	if (S.top == -1)		//栈空
		return false;
	//将出栈的值给x,然后top减1
	
	return S.data[S.top--];	
}

6.读取栈顶元素

bool GetTop(SequenStack S, Elemtype &x)
{
	if (S.top == -1)		//栈空
		return false;
	x = S.data[S.top];		//与出栈的区别是不需要移动top
	return true;
}

共享栈–顺序存储结构

分析:使两个栈分别从数组的两头开始向中间扩展,当两个栈的栈顶指针相遇时,表示两个栈都满了。

1.共享栈的结构

#define MaxSize 100
typedef int Elemtype;
typedef struct {
	Elemtype data[MaxSize];
	int top;		//数组下标
	int top1;
};

DStack S;

2.初始化

void InitDStack(DStack &S)
{
	S.top = -1;
	S.top1 = MaxSize;	
}

3.Push入栈

void Push(DStack * Ptrs, Elemtype x, int Tag)
{
	//Tag作为区分两个栈的标志,取值1和2
	if (Ptrs->top1 - Ptrs->top == 1)
	{
		printf("栈满\n");
		return ;
	}
	if (Tag == 1)	//等于1时让第一个口进
	{
		Ptrs->data[++(Ptrs->top)] = x;
	}
	else {	//等于2时从第二个口进
		Ptrs->data[--(Ptrs->top1)] = x;
	}
}

4.Pop出栈

Elemtype Pop(DStack *Ptrs, int Tag)
{
	//Tag 就是表示从哪个“口”出去
	if (Tag == 1)
	{
		if (Ptrs->top == -1)
		{
			printf("栈1为空");
			return NULL;
		}
		else {
			return Ptrs->data[(Ptrs->top)--];
		}
	}
	else
	{
		if (Ptrs->top1 == -1)
		{
			printf("栈2为空");
			return NULL;
		}
		else {
			return Ptrs->data[(Ptrs->top1)++];
		}
	}
}

二、栈的链式存储结构

采用链式存储结构的栈叫做链栈,通常采用单链表实现,规定链栈没有头结点
插入和删除操作只能在链栈的栈顶进行。

1.栈的链式结构定义

typedef struct LinkNode {
	int data;
	struct SNode *next;
}*LinkStack;

2.初始化

LinkStack InitStack()
{
	LinkStack S;
	S = (LinkStack)malloc(sizeof(LinkNode));	//S指针指向一个空间
	S->next = NULL;
	return S;
}

3.判断栈是否为空

int IsEmpty(LinkStack S)
{
	return (S->next == NULL);
}

你可能感兴趣的:(C)