栈的链表实现
记得以前大二学数据结构时利用C++数组实现过栈。这几天还是在看数据结构和算法方面的书,期望提高一下自己的内功。然后看到了很多关于栈的实现,其中要求利用链表实现很多。当时觉得这个应该很简单,所以直接就看了答案,看是否和自己的思路一样。当然,思路是一样了。但是发现所有的栈链表实现都是定义了一个全局变量来表示栈顶,然后这个栈的功能就是修改这个变量。
那么就有个问题了,这就代表这个栈结构每次只能实例化一个栈来用,不能用作两个,那如果某个应用需要利用两个栈,这就不好处理了,所以本人就想自己实现一个满足这个需求的栈。另外也是向学一下gdb调试。所以选简单点的实现。
废话不多说了,贴上代码:
/**********************************************
* copyright (c) 383569614@qq.com
* 2012-07 at Hunan University
* description: stack.h file
* the function's and node declaration
***********************************************/
#ifndef _STACK_H
#define _STACK_H
typedef struct DATA
{
int index;
}data;
typedef struct NODE
{
data d;
struct NODE *next;
}node;
typedef struct STACK
{
node *head;
int size;
}stack;
stack* init(stack* st); //init a stack
void push(stack* st,data d);//push d into stack
void pop(stack *st); //pop a elem from stack
data gettop(stack* st); //get the value of top of stack
int getsize(stack* st); //get the size of stack
void destroy(stack *st); //destroy a stack
int isempty(stack *st); //whether stack is empty
#endif
/*******************************************
* copyright (c) 383569614@qq.com
* 2012-07 at Hunan University
* description: stack.c
* implementations of my stack's interfaces
*******************************************/
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"
stack* init(stack* st)
{
st=(stack*)malloc(sizeof(stack));
st->head=NULL;
st->size=0;
return st;
}
void push(stack* st,data d)
{
node *p=(node*)malloc(sizeof(node));
p->d=d;
if(st->head==NULL)
{
st->head=p;
st->head->next=NULL;
}
else
{
p->next=st->head;
st->head=p;
}
st->size++;
}
void pop(stack* st)
{
if(st->head!=NULL)
{
node *p=st->head;
st->head=p->next;
st->size--;
free(p);
}
else
{
printf("stack is empty!\n");
}
}
data gettop(stack* st)
{
return st->head->d;
}
int getsize(stack* st)
{
return st->size;
}
void destroy(stack* st)
{
while(st->head)
{
node *p=st->head;
st->head=p->next;
free(p);
}
}
int isempty(stack* st)
{
return st->head==NULL;
}
/************************************
* copyright (c) 383569614@qq.com
* 2012-07 at Hunan University
* description: main.c
* test the function of my stack
**************************************/
#include <stdio.h>
#include "stack.h"
int main()
{
stack *st=NULL;
st=init(st);
int x=0;
data d;
for( x=0 ; x<10 ; x++ )
{
d.index=x;
push(st,d);
}
while(!isempty(st))
{
printf("%d ",gettop(st).index);
pop(st);
}
printf("\n");
destroy(st);
return 0;
}
分享到:
相关推荐
栈的实现(C语言)数组实现以及链表实现源码,以及各个功能测试代码函数等 和后缀式转前缀式的用例
在链表实现的栈中,每个节点包含一个数据元素和一个指向下一个节点的指针。当执行压栈操作时,新元素被添加到链表的头部;而弹栈操作则删除链表头部的元素。由于C++的链表操作比数组更灵活,它允许在运行时动态调整...
以下是一个简单的C语言栈链表实现: ```c #include #include typedef struct Node { int data; struct Node* next; } Node; Node* CreateStack() { Node* head = (Node*)malloc(sizeof(Node)); head->next ...
1. **优点**:链表实现的栈可以灵活地增加和减少存储空间,不会出现栈溢出的情况,因为节点可以在内存的任何位置,不受连续空间限制。 2. **缺点**:相对于数组,链表的插入和删除操作需要额外的指针操作,时间...
在C语言中,我们可以通过链表来实现栈的功能,这就是所谓的“栈链表”。在这个主题下,我们将深入探讨栈链表的概念、设计以及在C语言中的实现。 栈链表的核心是链表节点,每个节点包含一个数据元素和指向下一个节点...
本主题将聚焦于链表实现的C++栈模版,这是一种灵活且适应性强的实现方式,尤其适用于动态内存管理。 首先,我们需要理解链表的基本概念。链表是一种线性数据结构,其元素(节点)不是在内存中连续存储的,而是通过...
在"delimetermach.cpp"这个源代码文件中,很可能包含了具体的链表实现栈和队列的C++代码。通过阅读和分析这段代码,我们可以深入理解如何使用C++的指针和结构体来构建链表节点,以及如何通过指针操作来实现栈的压栈...
在链表实现中,`Push`操作需要创建新的节点,设置其数据值,并将其链接到当前栈顶。`Pop`操作则需删除栈顶节点,通常通过保存栈顶节点的前一个节点来实现,这样可以避免直接删除栈顶元素导致栈顶指针丢失。`Peek`、`...
与数组实现相比,链表实现栈具有动态扩展和收缩的优点,不需要预先确定栈的大小。链表中的每个节点包含两个部分:数据域(存储栈元素)和指针域(指向下一个节点)。栈顶元素是链表的最后一个元素,而栈底元素则是...
1. **压栈(Push)**:在双向链表实现的栈中,压栈操作是将新元素添加到链表的头部。这可以通过创建一个新的节点,将新元素作为其数据部分,并将其前向指针指向当前的头节点,然后更新头节点为新节点来完成。这样,新...
顺序栈是基于数组实现的栈,而链栈则是基于链表。对于顺序栈,当栈满时可能需要扩展数组,而链栈则没有这样的限制,可以在运行时动态增加节点。 对于队列的算法,考核内容是实现基本的队列操作,包括置空队列、入队...
在C++中,队列可以使用数组或链表实现。常见的队列操作有入队(enqueue)和出队(dequeue)。队列常用于任务调度、打印机作业管理和操作系统中的进程管理等场景。 4. **栈**:栈是一种后进先出(LIFO,Last In ...
理解并熟练掌握栈、链表和循环链表的概念及其在C语言中的实现,是提升编程技能的关键步骤。这些基础知识不仅在C语言编程中至关重要,也是其他高级数据结构和算法的基础。在实际编程项目中,它们常被用于优化内存使用...
使用链表实现的栈 包含栈的所有操作 对应于数据机构与算法分析(c++版)第三版或第二版 Clifford A.Shaffer 重庆大学使用教材
JAVA栈(链表实现)
在本篇内容中,我们将详细介绍STL中的几个基本概念:栈(Stack)、链表(List)、map、set。 ### 栈(Stack) #### 定义与特性 栈是一种特殊的线性表,其特点是只能在表的一端进行插入和删除操作,遵循后进先出...
链表实现的栈在空间效率上可能不如数组实现的栈,因为每个节点都需要额外的空间存储指针,但在处理大量数据且频繁的动态扩展时,链表的性能更优,因为它不需要像数组那样移动元素。 总之,Java中的栈可以通过数组或...
在这个主题中,我们将探讨如何利用栈和链表的数据结构来实现长整形的加减法运算,有效避免溢出问题。 首先,让我们了解栈(Stack)和链表(Linked List)的基本概念。栈是一种后进先出(LIFO)的数据结构,适用于...