`
chemingliang
  • 浏览: 134139 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数据结构:栈基本操作

阅读更多

/************************************************************************/

/* 数据结构:栈基本操作:进栈、出栈、打印栈                   */

/* 挑灯看剑-shuchangs@126.com 2010-10                                   */

/* 云歌国际(Cloud Singers International www.cocoral.com            */

/************************************************************************/

 

#include <stdio.h>

#include <malloc.h>

#include "core.h"

 

//结点数据结构

typedef struct NODE

{

       int data;

       struct NODE* next;

       struct NODE* prior;

}Node, * NodePointer;

 

//栈元数据结构

typedef struct STACK

{

       int len;

       struct NODE* top;

       struct NODE* base;

}Stack, * StackPointer;

 

void main()

{

       //*************函数原型******************

       Status StackIn(StackPointer SP, int e);

       void autoStack(StackPointer SP, int n);

       void StackPrint(Stack S, char tag);

       Status StackOut(StackPointer SP, NodePointer NP);

       //*************函数原型******************

 

 

       Stack S =

       {

              0, NULL, NULL

       };

       Node N =

       {

              0, NULL, NULL

       };

 

       int i = 0;

 

       autoStack(&S, 10);

       StackPrint(S, 'b');

 

       for (i = 0; i <= 11; i++)

       {

              StackOut(&S, &N);

              if (N.next == NULL && N.prior != NULL)

              {

                     printf("删除结点值:%d,前驱结点值:%d\n", N.data, N.prior->data);

              }

              else

              {

                     printf("删除结点值:%d\n", N.data);

              }

              StackPrint(S, 'b');

       }

       //StackPrint(S,'b');

}

//进栈操作,结点作为栈顶元素入栈

Status StackIn(StackPointer SP, int e)

{

       static Status StackIsEmpty(Stack S);//函数原型

       Status status = ERROR;

       NodePointer p = NULL;//遍历指针,非游离指针

       NodePointer NP = (NodePointer) malloc(sizeof(Node));

       NP->data = e;

       //进行预处理

       if (!StackIsEmpty(*SP))

       {

              //将结点追加为栈顶元素

              p = SP->top; //p指向栈顶

              p->next = NP;

 

              NP->prior = p;

              NP->next = NULL;

 

              SP->top = NP;

              SP->len += 1; //长度加1

              //puts("进栈成功!");

              status = OK;

       }

       else

       {

              SP->base = SP->top = NP;

              NP->next = NP->prior = NULL;

              SP->len = 1; //长度为1

              //puts("进栈成功!");

              status = OK;

       }

       return status;

}

 

//自动化栈

void autoStack(StackPointer SP, int n)

{

       COUNT i = 0;

       for (i = 0; i < n; i++)

       {

              if (StackIn(SP, i))

              {

              }

              else

              {

                     break;

              }

       }

}

 

static Status StackIsEmpty(Stack S)

{

       if (S.len == 0 || S.base == NULL || S.top == NULL)

              return TRUE;

       else

              return FALSE;

}

 

//出栈操作,并用结点返回该值

Status StackOut(StackPointer SP, NodePointer NP)

{

       Status status = ERROR;

       NodePointer p = SP->top; //p指向栈顶

       if (!StackIsEmpty(*SP))

       {

              if (SP->len == 1)

              {

                     SP->base = SP->top = NULL;

                     SP->len = 0; //长度为0

 

                     NP->data = p->data;

                     NP->next = p->next;

                     NP->prior = p->prior;

                     //puts("出栈成功!");

                     status = OK;

              }

              else

              {

                     p->prior->next = NULL;

                     SP->top = p->prior;

                     SP->len -= 1; //长度减1

                     NP->data = p->data;

                     NP->next = p->next;

                     NP->prior = p->prior;

                     //puts("出栈成功!");

                     status = OK;

              }

       }

       else

       {

              //puts("出栈失败!栈为空!");

              status = ERROR;

       }

       free(p); //p为游离结点,最后释放p内存

       return status;

}

 

//栈打印操作,tag参数IN SET{'B','T'}

void StackPrint(Stack S, char tag)

{

       static Status StackIsEmpty(Stack S);//函数原型

       NodePointer p = NULL;

       COUNT i = 1;

       COUNT n = S.len;

       printf("栈长度:%d\n", n);

       if (!StackIsEmpty(S)) //如果线性链表非空

       {

              switch (tag)

              {

              case 'B':

                     p = S.base;

                     puts("打印结点信息(栈底到栈顶):");

                     for (i = 1; i <= n; i++)

                     {

                            printf("Node[%d] = %d\n", i, p->data);

                            p = p->next;

                     }

                     break;

              case 'b':

                     p = S.base;

                     puts("打印结点信息(栈底到栈顶):");

                     for (i = 1; i <= n; i++)

                     {

                            printf("Node[%d] = %d\n", i, p->data);

                            p = p->next;

                     }

                     break;

              case 'T':

                     p = S.top;

                     puts("打印结点信息(栈顶到栈底):");

                     for (i = n; i >= 1; i--)

                     {

                            printf("Node[%d] = %d\n", i, p->data);

                            p = p->prior;

                     }

                     break;

              case 't':

                     p = S.top;

                     puts("打印结点信息(栈顶到栈底):");

                     for (i = n; i >= 1; i--)

                     {

                            printf("Node[%d] = %d\n", i, p->data);

                            p = p->prior;

                     }

                     break;

              default:

                     puts("打印失败!");

                     break;

              }

       }

       else //如果栈为空

       {

              puts("打印失败!栈为空!");

       }

 

       free(p);//p为游离结点,最后释放p内存

}

 

 

分享到:
评论

相关推荐

    数据结构:栈(包含线性表)

    对于顺序存储结构的栈,其基本操作包括: 1. 入栈(Push):在栈顶添加元素。 2. 出栈(Pop):移除并返回栈顶元素。 3. 查看栈顶元素(Top):不移除地查看栈顶元素。 4. 判断栈是否为空(IsEmpty):检查栈内是否...

    数据结构:栈子系统.docx

    数据结构中的栈是一种重要的抽象数据类型,它遵循“后进先出”(LIFO, Last In First Out)的原则。在本题中,我们讨论的是一个栈子系统,它包括了多个与栈操作相关的功能,如进栈、出栈、显示栈内所有元素以及两个...

    算法与数据结构:栈的实现

    栈是一种特殊的线性数据结构,遵循“后进先出”(LIFO)的原则,也就是最后进入的元素最先被取出。在计算机科学中,栈被广泛应用于各种算法和数据结构问题中,如表达式求值、递归、深度优先搜索等。本文将详细介绍栈...

    数据结构:栈的应用-算术表达式求解-后序表达式法

    它的操作主要包括两个基本操作:压入(Push)和弹出(Pop)。压入是在栈顶添加元素,弹出则是移除栈顶元素。栈在很多问题中都有应用,例如括号匹配、编译器中的符号表管理等,而计算算术表达式的值是另一个典型场景...

    数据结构--栈的基本操作

    总结来说,栈作为基础数据结构,其基本操作包括压栈、弹栈、查看栈顶元素、检查栈是否为空以及获取栈的大小。在各种计算任务和算法中,栈都扮演着不可或缺的角色。顺序栈作为栈的一种实现形式,以其简单的结构和易于...

    数据结构中栈和队的源代码

    栈和队列是两种最基本且重要的数据结构,广泛应用于各种算法和系统设计中。 首先,栈(Stack)是一种后进先出(LIFO, Last In First Out)的数据结构。它的工作原理类似于日常生活中使用的堆叠物品,最后放入的物品...

    数据结构:栈的应用-数制转换和括号匹配

    数据结构在计算机科学中扮演着至关重要的角色,其中栈(Stack)是一种常用且基础的数据结构。栈被称为“后进先出”(Last In First Out,简称LIFO)的数据结构,这意味着最后进入栈的元素最先被移出。在这个主题中,...

    数据结构中栈的基本操作

    本文主要介绍了如下栈的基本操作 初学者可参考 包括构造 销毁栈 置为空栈 初始栈 查找栈顶元素 删除栈顶元素 从栈底到栈顶依次访问栈中每个元素

    数据结构顺序栈验证实验报告.pdf

    数据结构中的顺序栈是一种特殊的线性表,它具有后进先出(LIFO)的特点,即...通过设计和实现顺序栈的基本操作,学生能够更好地掌握数据结构的原理和应用,而数制转换问题则进一步巩固了对数值计算和算法设计的理解。

    数据结构C++版--栈的实现及基本操作

    本主题聚焦于“数据结构C++版--栈的实现及基本操作”,我们将深入探讨栈这种特殊的数据结构以及如何用C++来实现它。 栈是一种线性数据结构,遵循“后进先出”(LIFO)的原则。这意味着最后插入的元素(称为顶元素...

    数据结构实验3:栈子系统.doc

    数据结构实验3:栈子系统.doc 数据结构实验3:栈子系统.doc是关于数据结构实验的第三个实验,主要介绍栈的特点、描述方法和实现...通过该实验,可以深入了解栈的原理和实现细节,从而更好地理解数据结构的基本概念。

    数据结构:线性表、链表、队列、栈、串

    本主题将深入探讨线性表、链表、队列、栈这四种基本的数据结构,并以C++语言为例,通过相关源代码(stringData.cpp、seqList.cpp、node.cpp、seqQueue.cpp、linkQueue.cpp、linkStack.cpp、seqStack.cpp)来解析其...

    数据结构栈的基本操作实现及栈的应用

    有关顺序栈的基本操作算法,分别编写栈初始化、入栈、出栈取栈顶元素等与本实验有关的实现顺序基本操作的函数以及括号匹配判断函数

    数据结构课内试验——顺序栈

    3. 顺序栈的基本操作:顺序栈的基本操作包括初始化、入栈、出栈、输出、销毁、置栈空、求栈长、判顺序栈是否为空、栈满、取栈顶元素。 4. 顺序栈的初始化:顺序栈的初始化是指为顺序栈分配内存空间,将其长度置为 0...

    数据结构与算法:栈队列的题库

    ### 数据结构与算法:栈与队列题库解析 #### 一、判断题解析 1. **正确**。栈的特点就是后进先出(LIFO, Last In First Out),因此所有的插入与删除操作均发生在栈顶。 2. **正确**。队列是一种先进先出(FIFO, ...

    数据结构的栈的基本操作C语言实现

    ### 数据结构中的栈及其基本操作C语言实现 #### 栈的概念 栈是一种特殊的线性表,其特殊之处在于它只允许在表的一端进行插入和删除操作,这一端被称为栈顶(Top)。另一端称为栈底(Bottom)。当表中没有元素时称为...

    C++数据结构实验二:栈与队列的应用

    3.掌握栈和队列的逻辑结构特点、顺序存储结构、链式存储结构、顺序栈和链栈的结构体类型定义、循环队列和链队列的结构体类型定义、栈和队列在两种存储结构上的各种基本操作的实现算法。 4.将任意十进制数转换为三种...

    数据结构栈的基本操作实验报告(已通过c++6.0)

    实验要求不仅限于栈的基本操作,还包括了队列(另一种线性数据结构)的实现,如链队列和循环队列,以及栈的应用,例如表达式求值和汉诺塔问题。在表达式求值中,栈可以用来处理括号内的运算,按照运算符的优先级进行...

    数据结构顺序栈的基本操作

    数据结构顺序栈的基本操作,包括删除,查找,入栈,出栈,输出,输入栈

Global site tag (gtag.js) - Google Analytics