数据结构—顺序栈

#include "StdAfx.h"
#include<stdio.h>
#include<stdlib.h>
#include<string.h>



//定义顺序栈类型

typedef int DataType;
struct stack
{
	int max;//栈最大容量
	int top;//栈顶指针
	DataType *elem;//elem动态分配内存后指向*elem数组起始地址
};
typedef struct stack *SeqStack;



//创建空栈

SeqStack SetNullStack_seq(int m)//m为指定的最大空间
{
	SeqStack sstack=(SeqStack)malloc(sizeof(struct stack));
	if(sstack->elem!=NULL)
	{
		sstack->elem=(int*)malloc(sizeof(int)*m);
		if(sstack->elem!=NULL)
		{
			sstack->max=m;//最大容量m
			sstack->top=-1;//栈顶初值-1
			return(sstack);
		}
		else
		{
			free(sstack);
			return NULL;
		}
	}
	else
	{
		printf("alloc failure");
		return NULL;
	}
}



//判断栈空

int IsNullStack_seq(SeqStack sstack)
{
	return(sstack->top==-1);//栈顶-1返回1,否则返回0
}



//进栈

void Push_seq(SeqStack sstack,int x)//x进栈
{
	if(sstack->top>=sstack->max-1)//判断栈满
		printf("overflow!\n");
	else
	{
		sstack->top++;//栈顶上移
		sstack->elem[sstack->top]=x;//将x置于栈顶
	}
}



//出栈

void Pop_seq(SeqStack sstack)
{
	if(IsNullStack_seq(sstack))//判断栈空
		printf("underflow!\n");
	else
		sstack->top=sstack->top-1;//栈顶下移
}



//取栈顶元素

DataType Top_seq(SeqStack sstack)
{
	if(IsNullStack_seq(sstack))//判断栈空
		printf("empty!\n");
	else
		return sstack->elem[sstack->top];//返回栈顶元素

}



//打印顺序栈

void printstack(SeqStack sstack)
{
    if (IsNullStack_seq(sstack))
        printf("\n The stack is NULL ! \n");
    else
    {
        for (int i = 0;i <=sstack->top;i++)
            printf("%d ",sstack->elem[i]);
    }
    printf("\n");
}


//主函数

int main()
{
	int m=10;//定义栈容量

	SeqStack stack1=SetNullStack_seq(m);//创空栈stack1

	Push_seq(stack1,5);//5,8,9依次进栈
	Push_seq(stack1,8);
	Push_seq(stack1,9);
	printstack(stack1);

	Pop_seq(stack1);//一次出栈(出栈栈顶元素)
	printstack(stack1);

	printf("栈顶元素:%d\n",Top_seq(stack1));//求栈顶元素值

	system("pause");
}
### 数据结构顺序栈定义与实现方法 #### 定义 顺序栈是一种基于数组实现的线性表数据结构,其特点是按照一定的顺序存储元素,并通过一个整变量 `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; } ``` 以上即是对顺序栈基本概念及其部分核心功能的具体阐述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值