数据结构之堆栈

  1 # include <stdio.h>
  2 # include <malloc.h>
  3 # include <stdlib.h>
  4
  5 typedef struct Node
  6 {
  7     int data;
  8     struct Node * pNext;
  9 }NODE, * PNODE;
 10
 11 typedef struct Stack
 12 {
 13     PNODE pTop;
 14     PNODE pBottom;
 15 }STACK, * PSTACK;  //PSTACK 等价于 struct STACK *
 16
 17 void init(PSTACK);
 18 void push(PSTACK, int );
 19 void traverse(PSTACK);
 20 bool pop(PSTACK, int *);
 21 void clear(PSTACK pS);
 22
 23 int main(void)
 24 {
 25     STACK S;  //STACK 等价于 struct Stack
 26     int val;
 27
 28     init(&S);  //目的是造出一个空栈
 29     push(&S, 1); //压栈
 30     push(&S, 2);
 31     push(&S, 3);
 32     push(&S, 4);
 33     push(&S, 5);
 34     push(&S, 6);
 35     traverse(&S); //遍历输出
 36
 37     clear(&S);
 38     //traverse(&S); //遍历输出
 39
 40     if ( pop(&S, &val) )
 41     {
 42         printf("出栈成功,出栈的元素是%d\n", val);
 43     }
 44     else
 45     {
 46         printf("出栈失败!\n");
 47     }
 48
 49     traverse(&S); //遍历输出
 50
 51     return 0;
 52 }
 53
 54 void init(PSTACK pS)
 55 {
 56     pS->pTop = (PNODE)malloc(sizeof(NODE));
 57     if (NULL == pS->pTop)
 58     {
 59         printf("动态内存分配失败!\n");
 60         exit(-1);
 61     }
 62     else
 63     {
 64         pS->pBottom = pS->pTop;
 65         pS->pTop->pNext = NULL; //pS->Bottom->pNext = NULL;
 66     }
 67 }
 68
 69 void push(PSTACK pS, int val)
 70 {
 71     PNODE pNew = (PNODE)malloc(sizeof(NODE));
 72
 73     pNew->data = val;
 74     pNew->pNext = pS->pTop; //pS->Top不能改成pS->Bottom
 75     pS->pTop = pNew;
 76
 77     return;
 78 }
 79
 80 void traverse(PSTACK pS)
 81 {
 82     PNODE p = pS->pTop;
 83
 84     while (p != pS->pBottom)
 85     {
 86         printf("%d  ", p->data);
 87         p = p->pNext;
 88     }
 89     printf("\n");
 90
 91     return;
 92 }
 93
 94 bool empty(PSTACK pS)
 95 {
 96     if (pS->pTop == pS->pBottom)
 97         return true;
 98     else
 99         return false;
100 }
101
102 //把pS所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中,如果出栈失败,返回false,否则返回true
103 bool pop(PSTACK pS, int * pVal)
104 {
105     if ( empty(pS) ) //pS本身存放的就是S的地址
106     {
107         return false;
108     }
109     else
110     {
111         PNODE r = pS->pTop;
112         *pVal = r->data;
113         pS->pTop = r->pNext;
114         free(r);
115         r = NULL;
116
117         return true;
118     }
119 }
120
121 //clear清空
122 void clear(PSTACK pS)
123 {
124     if (empty(pS))
125     {
126         return;
127     }
128     else
129     {
130         PNODE p = pS->pTop;
131         PNODE q = NULL;
132
133         while (p != pS->pBottom)
134         {
135             q = p->pNext;
136             free(p);
137             p = q;
138         }
139         pS->pTop = pS->pBottom;
140     }
141 }
时间: 2024-10-23 17:19:46

数据结构之堆栈的相关文章

数据结构之堆栈C++版

/* 堆栈本身就是一种线性数据结构,说白了他与容器线性表是一种数据类型,不要认为他多高大上. 实时上他还没有线性表复杂,下面简单的实现一下堆栈. 事实上整个核心操作都是在操作指向堆栈的顶部元素的指针 */ template <class T>class BaseStack { //出栈 virtual bool pop()  = 0; //进栈 virtual bool push(T x) = 0; //获取栈顶元素 virtual T top() const = 0; //清空堆栈 virt

数据结构--------(堆栈 和 队列)

1.栈 1.定义:只允许从一端插入或删除的线性表.逻辑结构:元素相邻:物理存储结构:顺序栈 和 链式栈:运算:只能从一端操作,受限的线性表 2.栈的基本操作: InintStack.StackEmpty.pop .push .peek(GetTop).ClearStack(6个) 3.顺序栈:利用一组连续地址存储单元存储自栈底到栈顶的元素,同时附有一个指针指向当前栈顶的位置 3.1  顺序栈操作: 初始时 S.top = -1;栈顶元素值:S.data[S.top] 进栈操作:首先判断是否栈满,

Mooc数据结构-02堆栈和队列

1 堆栈 1.1 堆栈的概念 表达式求值问题 表达式 = 运算数 + 运算符号 不同的运算符号优先级不一样 一般地, 运算是见到运算符号进行运算, 但是在一般的表达式中, 运算符号前面的值我们能够知道, 但是后面的值不一定是当前运算符运算的值, 因此这个运算增加了很大的困难 中缀表达式: 运算符位于两个运算数之间 后缀表达式: 运算符位于两个运算数之后 前缀表达式, 前中后缀表达式的转换 后缀表达式的求值顺序: 从左往右依次扫描, 遇到运算符就运算, 运算的运算数是就近就近就近的两个运算数 62

数据结构学习---堆栈的动态数组实现及链表实现

堆栈 [链表实现堆栈] 优点:可以无限增添元素,只要内存足够, 缺点:内存中存储位置不连续 typedef int ElementType; //只能向头部插入元素,因为如果在尾部插入,删除时,找不到上一个节点/ //因为链表是单向的 //所以 push pop 操作在头结点进行 class Stack{ public: Stack(){ S=(Stack*)malloc(sizeof(Stack)); //建立一个不存数据的头结点,方便增删节点 S->Next=NULL; sz=0; } bo

数据结构之堆栈java版

import java.lang.reflect.Array; /* 具体原理在c++版已经说的很清楚,这里不再赘述, 就提一点:java的泛型具有边界效应,一旦离开作用域立马被替换为object类型,在new泛型数组需要借助反射. */ interface BaseStack<T>{ boolean push(T x); boolean pop(); void clear(); T top();}public class JBStack<T> implements BaseSta

数据结构(2) -- 堆栈

1.顺序存储 //栈的顺序存储实现 //Stack.h #ifndef STACK_H_ #define STACK_H_ #define ElementType int #define MaxSize 100 typedef struct _Node { ElementType data[MaxSize]; int top; }Node; class Stack { private: Node data; public: Stack(); ~Stack(); int IsFull(); voi

数据结构之堆栈(数组实现)

/***************************** Date   : 2015-07-20* Description: stack.h*****************************/#ifndef _STACK_H#define _STACK_H template<class T>class Stack{public: Stack(int MaxStackSize = 10); ~Stack() {delete [] stack;} bool IsEmpty() cons

使用LinkedList模拟一个堆栈或者队列数据结构

使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出  如同一个杯子. 队列:先进先出  如同一个水管. import java.util.LinkedList; public class DuiLie { private LinkedList link; public DuiLie() { link = new LinkedList(); } public void myAdd(Object obj) { link.addFirst(obj); } public Object

java集合 collection-list-LinkedList 模拟一个堆栈或者队列数据结构。

/* 使用LinkedList模拟一个堆栈或者队列数据结构. 堆栈:先进后出 如同一个杯子. 队列:先进先出 First in First out FIFO 如同一个水管. */ import java.util.*; class DuiLie { private LinkedList link; DuiLie() { link = new LinkedList(); } public void myAdd(Object obj) { link.addFirst(obj); } public O