顺序栈和链栈

本文详细介绍了两种常见的栈实现方式:顺序栈和链栈。通过具体的代码示例展示了如何进行初始化、判断栈是否为空、元素的入栈和出栈等基本操作,并提供了测试函数验证栈的操作流程。

顺序栈和链栈

1.顺序栈

代码实现:

//#pragma once				//作为头文件时加上这行
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define DataType int
#define STACK_MAXSIZE 30
typedef struct {
	DataType stack[STACK_MAXSIZE];
	int top;	//栈顶,为0时表示栈空,为STACK_MAXSIZE+1时表示栈满
}SeqStack;

/*初始化栈*/
void StackInit(SeqStack* s);

/*判断栈,非空返回1,空返回0*/
int StackNotEmpty(SeqStack* s);

/*元素x入栈,成功返回1,失败返回0*/
int StackPush(SeqStack* s, DataType x);

/*出栈,将元素保存在x,成功返回1,失败返回0*/
int StackPop(SeqStack* s, DataType *x);

/*取栈顶,将元素保存在x,成功返回1,失败返回0*/
int StackTop(SeqStack* s, DataType *x);

void StackInit(SeqStack* s)
{
	s->top = 0;
}

int StackNotEmpty(SeqStack* s)
{
	if (s->top != 0)return 1;
	else return 0;
}

int StackPush(SeqStack* s, DataType x)
{
	if (s->top == STACK_MAXSIZE+1) {
		printf("栈已满,无法入栈\n");
		return 0;
	}
	s->stack[s->top++] = x;
	return 1;
}

int StackPop(SeqStack* s, DataType *x)
{
	if (StackNotEmpty(s)) {
		s->top--;
		*x = s->stack[s->top];
		return 1;
	}
	printf("栈为空,元素出栈\n");
	return 0;
}
int StackTop(SeqStack* s, DataType *x)
{
	if (StackNotEmpty(s)) {
		*x = s->stack[s->top-1];
		return 1;
	}
	printf("栈中元素为空,栈顶无元素可取\n");
	return 0;
}

测试函数:

void test()
{
	int i,x;
	SeqStack s;
	StackInit(&s);
	printf("依次将0-9入栈,然后出栈\n");
	for(i=0;i<10;i++)
	StackPush(&s,i);
	while(StackNotEmpty(&s))
	{
		StackTop(&s,&x);
		printf("%d ",x);
		StackPop(&s,&x);
	}
}

运行结果:
在这里插入图片描述

2.链栈

代码实现:

//#pragma once				//作为头文件时加上这行
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define DataType int
typedef struct stack_node		//链栈的节点 
{
	DataType data;
	struct stack_node* next;
}LinkedStack;

//链栈的实现是带头结点,且头结点相连的一端为栈顶,这样插入和删除操作的时间复杂度为O(1)
//也可不带头结点,但是如果不带头结点,每次插入或删除操作后都会修改头指针

/*初始化栈*/
void StackInit(LinkedStack* s);

/*判断栈,非空返回1,空返回0*/
int StackNotEmpty(LinkedStack* s);

/*元素x入栈*/
void StackPush(LinkedStack* s, DataType x);

/*出栈,将元素保存在x,成功返回1,失败返回0*/
int StackPop(LinkedStack* s, DataType *x);

/*取栈顶,将元素保存在x,成功返回1,失败返回0*/
int StackTop(LinkedStack* s, DataType *x);

/*撤销链栈的内存空间*/
void StackDestory(LinkedStack* s);

void StackInit(LinkedStack* s)
{
	s->next = NULL;
}

int StackNotEmpty(LinkedStack* s)
{
	if (s->next != NULL)return 1;
	else return 0;
}

void StackPush(LinkedStack* s, DataType x)
{
	LinkedStack *p1 = NULL, *p2 = NULL;
	p1 = (LinkedStack*)malloc(sizeof(LinkedStack));
	p1->data = x;
	p2 = s->next;
	p1->next = p2;
	s->next = p1;
}

int StackPop(LinkedStack* s, DataType *x)
{
	LinkedStack *p = NULL;
	if (StackNotEmpty(s)) {
		p = s->next;
		s->next=p->next;
		*x = p->data;
		free(p);
		return 1;
	}
	printf("栈为空,无元素出栈\n");
	return 0;
}

int StackTop(LinkedStack* s, DataType *x)
{
	if (StackNotEmpty(s)) {
		*x = s->next->data;
		return 1;
	}
	printf("栈为空,栈顶无元素可取\n");
	return 0;
}

void StackDestory(LinkedStack* s)
{
	LinkedStack *p1 = NULL, *p2 = NULL;
	p1 = s->next;
	while (p1 != NULL)
	{
		p2 = p1;
		p1 = p1->next;
		free(p2);
	}
	s->next = NULL;
}

测试函数:

void test()
{
	int i,x;
	LinkedStack s;
	StackInit(&s);
	printf("依次将0-9入栈,然后出栈\n");
	for(i=0;i<10;i++)
	StackPush(&s,i);
	while(StackNotEmpty(&s))
	{
		StackTop(&s,&x);
		printf("%d ",x);
		StackPop(&s,&x);
	}
}

运行结果:
在这里插入图片描述

### 顺序栈的区别及优缺点比较 #### 1. 存储结构 顺序栈的主要区别在于它们的存储结构不同。顺序栈使用数组作为其底层存储结构,而则使用表实现[^1]。 #### 2. 的操作 无论是顺序栈还是,其主要操作包括入(Push)(Pop)。对于而言,这些操作均在表头部行,因为是一种运算受限的单表[^3]。顺序栈的操作则依赖于顶指针的变化来完成元素的插入删除[^4]。 #### 3. 顶元素获取 当非空时,无论是顺序栈还是,获取顶元素的操作逻辑相同:返回当前顶元素的值,同时顶指针保持不变[^2]。 #### 4. 优缺点比较 - **顺序栈的优点**: - 空间利用率较高,因为数组的空间是连续分配的,便于管理[^4]。 - 元素访问速度快,由于数组支持随机访问,因此可以快速定位顶元素或任意位置的元素[^4]。 - **顺序栈的缺点**: - 需要预先定义的最大容量,可能导致空间浪费或不足[^4]。 - 当满时无法动态扩展,可能限制程序的功能。 - **的优点**: - 动态分配内存,不需要预先定义的大小,可以根据需要动态扩展[^3]。 - 不会现因满而导致的溢问题[^3]。 - **的缺点**: - 每个节点需要额外的空间存储指向下一个节点的指针,因此空间开销较大[^3]。 - 访问元素的速度较慢,因为表不支持随机访问,必须从头开始逐个查找[^3]。 ```python # 示例代码顺序栈 class SeqStack: def __init__(self, size): self.stack = [0] * size self.top = -1 self.size = size def push(self, value): if self.top == self.size - 1: print("Stack Overflow") return False self.top += 1 self.stack[self.top] = value return True def pop(self): if self.top == -1: print("Stack Underflow") return None value = self.stack[self.top] self.top -= 1 return value # 示例代码 class Node: def __init__(self, data): self.data = data self.next = None class LinkStack: def __init__(self): self.top = None def push(self, value): new_node = Node(value) new_node.next = self.top self.top = new_node def pop(self): if self.top is None: print("Stack Underflow") return None value = self.top.data self.top = self.top.next return value ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值