栈的链表实现

/*
MyArryLinkstack.h
*/
#ifndef _MYARRYLINKSTACK_H_
#define _MYARRYLINKSTACK_H_
#include <stdlib.h>
#define ElementType int
#define EmptyTOS (-1)
#define MinStackSize (5)
typedef struct {
	int Capacity;
	int Top;
	ElementType *Array;
}StackRecord, *pStack;
int IsEmpty(pStack S);
int IsFull(pStack S);
pStack CreatStack(int MaxElements);
void DisposeStack(pStack S);
void MakeEmpty(pStack S);
ElementType GetTop(pStack S);
void Push(pStack S, ElementType x);
void Pop(pStack S);
ElementType TopAndPop(pStack S);
#endif

/*
MyArryLinkstack.c
*/
#include "MyArryLinkstack.h"
/*栈的创建,数组实现*/
pStack CreatStack(int MaxElements)
{
	pStack S;
	if (MaxElements < MinStackSize)
		perror(" Stack is too small!");

	S =(pStack) malloc(sizeof(StackRecord));
	if (S == NULL)
		perror("Out of Space!");

	S->Array = malloc(sizeof(ElementType) * MaxElements);
	if (S->Array == NULL)
		perror("Out of Space!!!");
	S->Capacity = MaxElements;
	MakeEmpty(S);

	return S;
}
/*创建一个空栈*/
void MakeEmpty(pStack S)
{
	S->Top = EmptyTOS;
}

/*判断是否空栈*/
int IsEmpty(pStack S)
{
	return S->Top == EmptyTOS;
}

/*判断是否满栈*/
int IsFull(pStack S)
{
	return S->Top == S -> Capacity - 1;
}

/*进栈*/
void Push(pStack S, ElementType x)
{
	if (IsFull(S))
		perror("Full Stack!");
	else
		S->Array[++S->Top] = x;
}
/*出栈*/
void Pop(pStack S)
{
	if (IsEmpty(S))
		perror("Empty Stack!");
	else
		S->Top--;
}
/*取得栈顶元素*/
ElementType GetTop(pStack S)
{
	if (IsEmpty(S)){
		perror("Empty Stack!");
		return 0;
	}
	else
		return S->Array[S->Top];
}

/*
main.c
*/
/* LinkStackTest.c */
#include <stdio.h>
#include "MyArryLinkstack.h"

int main()
{
	pStack pS = NULL;
	int a;
	pS = CreatStack(5);
	Push(pS, 1);
	a = GetTop(pS);
	Push(pS, 3);
	a = GetTop(pS);
	Push(pS, 5);
	a = GetTop(pS);
	Push(pS, 7);
	a = GetTop(pS);
	Push(pS, 9);
	a = GetTop(pS);
	Pop(pS);
	a = GetTop(pS);
}

  

时间: 2024-10-15 19:52:46

栈的链表实现的相关文章

数据结构学习——栈的链表实现(程序化)

关于栈的基本概念以及和Catalan数的关系,可以参见我的其他文章 参考资料<数据结构与算法分析--C语言描述> #include<stdio.h> #include<stdlib.h> /*栈的链表实现*/ typedef struct StackNode { struct StackNode *next; int data; }StackNode,*Stack; Stack CreateStack(void);//创建一个空栈 void MakeEmpty(Stac

顺序栈与链表栈的实现

栈是一种常见的数据结构,它虽然有栈顶和栈底之分,但它只能从一端操作(插入或删除),从而是一种"先进后出"的操作模式.向栈内进数据称为压栈(Push),从栈里取出数据叫出栈(POp).例如压栈顺序为1.2.3.4.5,着出栈的顺序为5.4.3.2.1(只考虑一次性出栈的情况). 栈按照存储的方式,又分为顺序栈和链表栈.顺序栈基于数组实现,所以顺序栈存储数据的内存是连续的,在创建栈时规定好栈的大小,这样对内存的使用效率并不高.而链式栈则是采用了链表来实现,其元素的存储地址是不连续的,而且是

数据结构应用实例#栈&amp;单链表#简易计算器

使用数据结构中的栈以及链表来制作一个能够处理中缀表达式的计算程序. 在该程序中输入的数字可以是任意正数.小数.(忘了添加对负数的支持,尽快补上) 输入的运算符可以是 + - * / ( ) 但请确保输入的表达式合法. 中缀表达式: 形如 9+(3-1)*3+10/2 的数学表达式.特点是运算符在被运算的两个数字中间,也就是我们日常接触的算式. 后缀表达式: 以上面的中缀表达式 9+(3-1)*3+10/2 为例 转换成后缀表达式为 9 3 1-3*+ 10 2/+ 特点是运算符紧跟在被运算的两个

数据结构---栈的链表实现

栈的链表实现C代码如下: #include <stdio.h> typedef int ElemType; typedef struct node { ElemType Data; struct node *next; }Node; typedef struct stack { Node *top; }Stack; //初始化栈 void InitStack(Stack *S) { S->top=NULL; } //入栈 int PushStackValue(Stack *S) { pr

数据结构:使用栈对链表元素位序进行反转

给定一个链表,业务需求:使用栈将链表中元素的次序进行反转. 输入 : List = 3 -> 2 -> 1 输出 : 1 -> 2 -> 3 输入 : 9 -> 7 -> 4 -> 2 输出 : 2 -> 4 -> 7 -> 9 算法过程:算法复杂度:O(n)1.遍历列表,将所有节点推到栈上.2.遍历栈,并依次从栈顶弹出元素用相反顺序存储.java代码: // Java program to reverse linked list // usin

算法导论9:栈的链表实现 2016.1.9

一直想做一个链表实现的栈,今天终于实现了.确实比数组要难多了,打了很久,很长时间花在了想象上(指针调试比较复杂..) 但是链表实现有一个最大的好处,就是动态分配内存,所以一般不会出现栈顶溢出的问题. 值得一提的是代码中比昨天的多了一个build函数.建立一个新栈.那么init函数,还是初始化一个栈.昨天用数组写的时候这两个函数是一样的.但是用链表之后才发现两者还是有区别.一个是从无到有,一个是从有到无.只不过数组的时候本来都有,不涉及自己申请空间的问题,所以两个的操作可以相同,但是到了链表,内存

栈的链表实现(JAVA)

大家知道,栈的实现可以是链表或数组或其他多种方式,链表的好处就是不会限制大小而且出栈和入栈速度都很快.下面我们来看代码: public class ListNode{ Object val; ListNode next = null; public ListNode(Object val){ this.val = val; } } public interface StackInterf { //定义压栈操作 public void push(Object o); //定义出栈操作 public

线性结构栈之链表实现

#include<stdio.h> #include<malloc.h> #include<stdlib.h> //结点数据类型 typedef struct Node { int data; struct Node *next; }NODE,*PNODE; //栈数据类型 typedef struct { PNODE top; int cnt; }Stack; //想想看,为什么栈的数据结构是这样,我是这样思考的,如果你不这样写可以, //那你必须造出一个计数的结点和

队列,栈,链表,学习中的一次总结(1)

经过一段时间的java学习后,在老师的引领下,做了一个终极阉割版的画图软件,可以实现的功能有限,未实现的功能被当作扩展. 上面是老师带领下的版本,可以通过单选按钮来选择绘画的图形:实现了鼠标左键绘制图形颜色为颜色1,右键绘制图形颜色为颜色2.:一些常用不可改变的颜色选择,通过点选按钮:颜色1和颜色2 来改变左右键的颜色.在颜色选择面板下预留了可以自定义的颜色框: 通过点击编辑颜色按钮弹出位于屏幕中央(可变化)的颜色编辑板,在颜色编辑板上选择的颜色会改变常用颜色选择面板最下方预留出来的自定义颜色选

C++ 栈 (链表实现)

第一.基本概念 栈中的元素遵守“先进后出”的原则(LIFO,Last In First Out) 只能在栈顶进行插入和删除操作 压栈(或推入.进栈)即push,将数据放入栈顶并将栈顶指针加一 出栈(或弹出)即pop,将数据从栈顶删除并将栈顶指针减一 栈的基本操作有:pop,push,判断空,获取栈顶元素,求栈大小 第二.实现方式 栈一般 采用数组或者链表2中方式实现,各有各的特点,我这里采用倒插法链表实现 第三.代码实现 #pragma once #include <iostream> usi