数据结构—顺序栈

顺序栈是利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的元素数据。分别使用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;
}
  • 运行结果

### 数据结构顺序栈的定义与实现方法 #### 定义 顺序栈是一种基于数组实现的线性表数据结构,其特点是按照一定的顺序存储元素,并通过一个整型变量 `top` 来记录当前栈顶的位置。当栈为空时,通常设定 `top = -1` 表示栈底[^1]。 #### 结构体定义 以下是顺序栈的一种典型定义方式: ```c typedef int DataType; typedef struct { DataType *data; /* 存储栈中元素的一维数组 */ int maxsize; /* 栈的最大容量 */ int top; /* 栈顶指针 */ } SeqStack; ``` 另一种常见的定义形式如下所示[^2]: ```c #define MaxSize 10 typedef struct SqStack { int data[MaxSize]; /* 存放栈元素的固定大小数组 */ int top; /* 栈顶指针 */ } SqStack; ``` 两种定义的区别在于动态分配内存的方式不同:前者允许动态调整栈的空间大小,而后者则限定了固定的栈长度。 #### 初始化 为了使顺序栈能够正常工作,在使用前需要对其进行初始化操作。具体来说,就是将栈顶指针 `top` 设置为 `-1` 的初始状态,表明此时栈为空。 ```c void InitStack(SeqStack *stack, int size) { stack->data = (DataType *)malloc(size * sizeof(DataType)); stack->maxsize = size; stack->top = -1; } ``` 对于第二种定义,则可以直接赋初值给成员变量完成同样的目的。 #### 判空函数 判断一个顺序栈是否为空的操作非常简单,只需检查 `top` 是否等于 `-1` 即可: ```c bool IsEmpty(const SeqStack* s){ return (s->top == -1); } ``` 或者针对第二种定义版本: ```c bool StackEmpty(SqStack S){ if(S.top == -1) // 如果栈顶索引为-1,则说明该栈没有任何有效元素存在 return true; else return false; } ``` 以上即是对顺序栈基本概念及其部分核心功能的具体阐述。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值