数据结构—顺序栈

顺序栈是利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的元素数据。分别使用top指针和base指针指向栈顶和栈底。

  • 栈为空的标志是:top==base.
  • 要注意的是:非空栈的栈顶指针总是指向栈顶元素的上一个位置
  • 栈满时的处理方法:
    • 1、报错,返回操作系统。
    • 2、分配更大的空间,作为栈的存储空间,将原栈的内容移入新栈。

1.顺序栈的表示

#define  MAXSIZE  100
typedef struct
{
    SElemType   *base;
    SElemType   *top;
    int stacksize;
}SqStack

2.顺序栈初始化

  • 算法步骤
    • 1、分配空间并检查空间是否分配失败,若失败则返回错误
    • 2、设置栈底和栈顶指针:S.top = S.base;此处要注意语句应该是S.top=S.base 而不是S.base=S.top
    • 3、设置栈大小
  • 算法描述
int InitStack(SqStack &S)
{
	S.base=new int[MAX];  // 为顺序栈动态分配一个最大容量为MAX的数组空间
	if(!S.base)
	{
		return 0;
	}

	S.top=S.base;
	S.stacksize=MAX;
	return 1;
}

2.判断顺序栈是否为空

int StackEmpty( SqStack S )
{
    if(S.top == S.base) 
        return 0;  // 为空
    else 
        return 1;  // 非空
}

3.求顺序栈的长度

int StackLength(SqStack S)
{
    return S.top – S.base;
}

4.清空顺序栈

int ClearStack(SqStack S)
{
    if(S.base) 
        S.top = S.base;
	
    return 1;
}

5.销毁顺序栈

Status DestroyStack(SqStack &S)
{
    if(S.base)
    {
	    delete S.base ;
	    S.stacksize = 0;
	    S.base = S.top = NULL;
    }
  
    return 1;
}

6.顺序栈入栈

  • 算法步骤
    • 1、判断是否栈满,若满则出错
    • 2、元素e压入栈顶
    • 3、栈顶指针加1
  • 算法描述
int Push_S(SqStack &S,int e)
{
    //将元素e入栈 
    if(S.top-S.base==S.stacksize)  //判断栈是否满 
    {
        return 0;
    }
	
    *S.top++=e;   // *S.top=e;  S.top++;
    return 1;
}

7.顺序栈出栈

  • 算法步骤
    • 1、判断是否栈空,若空则出错 
    • 2、栈顶指针减1
    • 3、栈顶元素出栈
  • 算法描述
//出栈
int Pop_S(SqStack &S,int &e)
{
	//用e返回出栈的元素
    if(S.top==S.base)
    {//栈空 
        return 0;
    } 
	
    e=*--S.top;  // --S.top;e=*S.top;
    return 1;
}

8.取栈顶元素

  • 算法步骤
    • 判断是否空栈,若空则返回错误,否则通过栈顶指针获取栈顶元素
  • 算法描述
int GetTop( SqStack S, SElemType &e)  
{
    if( S.top == S.base )	 
        return 0; 	// 栈空
    e = *(S.top – 1);
    return 1;
}

9.代码实现

  • main.cpp
#include <iostream>

using namespace std;

#define MAX 100

//顺序栈的定义 
typedef struct 
{
	int *base;
	int *top;
	int stacksize;
}SqStack;

//初始化
int InitStack(SqStack &S) 
{
	S.base = new int[MAX]; // 为顺序栈动态分配一个最大容量为MAX的数组空间
	if (!S.base) 
	{
		return 0;
	}
	
	S.top = S.base;//初始化将栈置空,就是让头指针指向尾指针,从语句上讲就是把尾指针的值赋值给头指针 
	S.stacksize = MAX;
	
	return 1;
}

//入栈
int Push_S(SqStack &S, int e) 
{
	//将元素e入栈 
	if (S.top - S.base == S.stacksize) // 判断栈是否满 
	{
		return 0;
	}
	*S.top++ = e;   // *S.top=e;  S.top++;
	
	return 1;
}

//出栈
int Pop_S(SqStack &S, int &e) 
{
	//用e返回出栈的元素
	if (S.top == S.base) // 判断栈是否为空 
	{                
		return 0;
	}
	e = *--S.top;   // --S.top;e=*S.top;
	
	return 1;
}

// 取栈顶元素
int GetTop( SqStack S, int &e)  
{
	if (S.top == S.base)
		return 0; 	// 栈空
	
	e = *(S.top - 1);
	
	return 1;
}

int main()
{
	SqStack S;

	if (InitStack(S)) 
	{
		printf("顺序栈初始化成功!\n");
	}
	else 
	{
		printf("顺序栈初始化失败!\n");
	}

	int loop = 1;
	int e1;
	int i = 1;
	
	// 入栈
	printf("请输入入栈元素(输入0终止):\n");
	while (loop) 
	{
		printf("请输入第%d个元素值:",i++);
		scanf("%d", &e1);
		if (e1 != 0) 
		{
			Push_S(S,e1);

		}
		else if (e1 == 0) 
		{
			loop = 0;
		}
	}

	// 取栈顶元素
	int e2;
	GetTop(S, e2);
	printf("栈顶元素是:%d\n", e2);

	// 出栈
	int e3; int j = 1;
	while (S.top != S.base)
	{
		Pop_S(S, e3);
		printf("第%d个出栈的元素是:%d\n",j++,e3);
	}
	
	system("pause");
	
	return 0;
}
  • 运行结果

猜你喜欢

转载自blog.csdn.net/qq_22847457/article/details/94354768
今日推荐