栈的基本操作(初始化,进栈,出栈等)

#include<stdio.h>
#include<stdlib.h>
#define ElemType int
#define INITSIZE 100//初始时栈的容量
#define ADDEDSIZE 10//每次新增加的容量
typedef struct
{
	ElemType* base;
	ElemType* top;
	int stacksize;
}stack;
void InitStack(stack  &S)//初始化
{
	S.base = (ElemType*)(malloc(INITSIZE * sizeof(int)));
	S.top = S.base;//栈空:top=base 
	S.stacksize = INITSIZE;
}
bool GetTop(stack& S, int& e)//返回栈顶元素
{
	if (S.top == S.base)
		return false;
	e = *(S.top-1);
	return true;
}
void jinzhan(stack& S, int e)//进栈操作
{
	if (S.top - S.base >= S.stacksize)//栈满
	{
		S.base = (ElemType*)(realloc(S.base, (S.stacksize + ADDEDSIZE) * sizeof(ElemType)));//栈满,申请空间,此处使用realloc函数在原有的指针域继续申请空间
		S.top = S.base + S.stacksize;
		S.stacksize += ADDEDSIZE;
	}
	*S.top = e;
	S.top++;
}
bool chuzhan(stack& S, ElemType* e)//出栈操作
{
	if (S.top == S.base)
		return false;
	S.top--;
	e = S.top;
	return true;
}
int getlength(stack&S)//总长度
{
	int i;
	i = S.top - S.base;
	return i;
}
bool isEmpty(stack& S)
{
	if (S.base == S.top)
		return false;
	return true;
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 链式是一种基于链表实现的结构,它可以动态地分配内存空间,不会出现满的情况。下面是链式的几个典型操作: 1. 初始化 链式初始化就是创建一个空链表,将顶指针指向链表的头结点。代码如下: ``` typedef struct Node { int data; struct Node *next; } Node; typedef struct Stack { Node *top; } Stack; void initStack(Stack *s) { s->top = (Node *)malloc(sizeof(Node)); s->top->next = NULL; } ``` 2. 进栈 链式进栈操作就是在顶插入一个新的结点,将顶指针指向新的结点。代码如下: ``` void push(Stack *s, int data) { Node *newNode = (Node *)malloc(sizeof(Node)); newNode->data = data; newNode->next = s->top->next; s->top->next = newNode; } ``` 3. 出栈 链式出栈操作就是将顶结点删除,并将顶指针指向下一个结点。代码如下: ``` int pop(Stack *s) { if (s->top->next == NULL) { printf("Stack is empty.\n"); return -1; } Node *p = s->top->next; int data = p->data; s->top->next = p->next; free(p); return data; } ``` 以上就是链式初始化进栈出栈等典型操作的实现。 ### 回答2: 链式是一种使用链表结构实现的。与顺序不同,链式的大小可以动态地进行调整,因为链式不需要在创建时指定固定的大小。本文将介绍链式初始化进栈出栈等典型操作。 链式的节点比顺序的元素复杂一点,每个节点应该包含两部分:数据部分和指向下一个节点地址的指针。因此,链式的第一个节点被称为顶,最后一个节点被称为底。 初始化: 链式初始化非常简单,只需要新建一个空的链表头节点,并将顶指针指向该节点即可。示例代码如下: ``` struct Node { int data; struct Node *next; }; struct Stack { struct Node *top; }; void initStack(Stack *s) { s->top = new Node; s->top->next = NULL; } ``` 进栈操作: 进栈操作包括两个步骤:新建节点,并将其插入到链表的头部。新建节点时,需要将其数据部分初始化为要入的元素;插入节点时,需要将新建节点的next指针指向当前顶,然后将top指针指向新建节点。示例代码如下: ``` void push(Stack *s, int data) { Node *new_node = new Node; new_node->data = data; new_node->next = s->top; s->top = new_node; } ``` 出栈操作: 出栈操作包括两个步骤:将顶元素弹出,删除链表头部的节点。弹出栈顶元素时,需要将top指针指向下一个节点,并返回顶元素;删除节点时,需要先将当前顶元素的下一个节点指针保存到一个临时指针中,然后将顶指针指向该指针所指向的节点,并释放原来的头节点。示例代码如下: ``` int pop(Stack *s) { if (s->top == NULL) return -1; // 为空 int data = s->top->data; Node *temp = s->top->next; delete s->top; s->top = temp; return data; } ``` 除了以上的典型操作外,链式还可以进行其他操作,例如判断是否为空、访问顶元素等。需要注意的是,链式的操作应该注意内存管理,避免内存泄漏和空指针引用等问题。 ### 回答3: 链式是一种基于链表实现的结构,相比于顺序,它的优点在于动态性更好,没有容量限制,能够更灵活地处理空间问题。 链式通常由链表节点和与其相关的指针组成。在初始化链式时,需要分配一个头节点,这个头节点不存储数据,只是为了方便链式的操作而设置的。 进栈操作是链式最常用的操作之一,其实现方法也比较简单。首先要对入元素开辟一个新的节点,并存储这个元素的值。然后将这个新节点插入到链表的表头,即让新节点的next指针指向原来的头节点。最后将头节点指向新节点,完成入操作。 出栈操作和进栈操作相对应,它的实现过程也很简单。首先需要判断链表是否为空,如果为空,则抛出异常。如果链表不为空,就将头节点指向链表的下一个节点。接着将原来的头节点所指向的节点从链表中删除,并释放它所占用的内存。最后将出栈元素的值返回即可。 在实际应用中,链式还有其他一些常用的操作,比如判断是否为空、获取顶元素的值等等。这些操作与顺序的操作相似,只是具体实现方式不同而已。 总之,链式是一种比较常用的数据结构,可以广泛应用到各种算法和程序中。掌握链式初始化进栈出栈等典型操作,有助于提高程序的效率和优化程序的结构,值得学习和掌握。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值