栈的顺序存储结构和链式存储结构

1.栈的定义:

在表尾进行插入和删除操作的线性表(仍然满足线性表的操作,只是在push和pop有些区别)

栈顶(top)允许插入和删除,另一端称栈底(bottom),不含任何数据元素的栈叫空栈。

栈:后进先出(last in first out)的线性表,简称LIFO结构。

栈的插入称为进栈,也称压栈,入栈。

栈的删除称为出栈,也称弹栈。

2.栈的抽象数据结构

  因为栈本身就是一个线性表,所以线性表的操作特性它都具备,针对它的特殊性,在它的操作上可能会有一些变化。将进栈和出栈分别改名为push和pop。由于栈本身是一个线性表,所以线性表的顺序存储结构和链式存储结构同样适用于栈。

3.栈的顺序存储结构

栈的顺序存储结构,简称顺序栈。定义一个top变量来指示栈定元素在数组中的位置。若存储栈的长度为StackSize,则栈顶位置top必需小于StackSize。下标从0开始,当栈存在一个元素时候,top 等于 0 ,当栈为空栈时候,top 等于 -1。

栈的结构定义

 typedef int SElemType;
    typedef struct {
        SElemType data[MAXSIZE];
        int top;                //用于栈顶指针
    } SqStack;

若现在有一个栈,StackSize为5,则普通栈、空栈、满栈的情况如下图所示。                                    

4.进栈

status pushStack(stack* s ,SElemType e)
{
	if(s->top == MaxSize - 1 )
		exit(error);
	s->top++;
	s->data[s->top] = e;
	//s->top++;
	return OK;
}

5.出栈

status popStack(stack* s )
{
	if(s->top == -1)
		exit(error);
	s->top--; //出栈并不是把这个元素改为0才可以。

}
//栈的顺序存储结构
#include<iostream>
#define MaxSize 10
#define OK 1 
#define error -1
using namespace std;
typedef int SElemType;
typedef int status;
typedef struct
{
	SElemType data[MaxSize];
	int top;
}stack;
//两栈共享空间
typedef struct
{
	SElemType data[MaxSize];
	int top1;
	int top2;
}DoubleStack;
stack* creatStack()
{
	stack *stack1 = (stack*)malloc(sizeof(stack));
	stack1->top = -1;
	return stack1;
}
status pushStack(stack* s ,SElemType e)
{
	if(s->top == MaxSize - 1 )
		exit(error);
	s->top++;
	s->data[s->top] = e;
	//s->top++;
	return OK;
}
status popStack(stack* s )
{
	if(s->top == -1)
		exit(error);
	s->top--; //出栈并不是把这个元素改为0才可以。
}
void printStack(stack* s)
{
	while(s->top != -1)
	{
		//s->data 是栈的首地址
		cout<<s->data[s->top]<<endl;
		s->top--;
	}
}
//两栈共享空间
status pushDoubleStack(DoubleStack *s ,SElemType num ,SElemType insertStack)
{
	if(s->top1 + 1 == s->top2)
		return error;
	if(insertStack!= 1&&insertStack != 2 )
		return error;
	if(insertStack == 1)
		s->data[++s->top1] = num;
	else if (insertStack == 2)
		s->data[--s->top2] = num;
	return OK
} //--和 ->运算等级

status popDoubleStack(DoubleStack *s ,SElemType* e  ,SElemType deleteStack) 
	//SElemType* e 来接受出栈的值  deleteStack从栈1 或者栈2 删除
{
	
	if(deleteStack == 1)
	{
		//首先进行判断空处理 
		if(s->top1 == -1)
			return error;
		*e = s->data[s->top1++];
	}
	else if(deleteStack == 2)
	{
		if(s->top2 == MaxSize)
			return error;
		*e = s->data[s->top2--];
	}
	return OK;

}
void main()
{
	stack *s = creatStack();
	pushStack(  s ,5 );
	printStack(s);

}

栈的链式存储结构称做链栈。

链栈空的定义top == NULL

进栈操作

status pushStackLinkList(StackLinkList* s,eleType e)
{
	Stacknode* p = (Stacknode*)malloc(sizeof(Stacknode));
	p->data = e;
	p->next = s->top;
	s->top = p;
	s->count++;
	return OK;
}

出栈操作

status popStackLinkList(StackLinkList* s,eleType* e)
{
	//判断空处理
	if(s->top == NULL)
		return error;
	*e = s->top->data;
	Stacknode* p = s->top;
	s->top = s->top->next;
	free(p);
	s->count--;
	return OK;

}

栈的应用 ---递归!(没有写代码)

猜你喜欢

转载自blog.csdn.net/qq_34269988/article/details/82973282