顺序堆栈和链式堆栈的实现,用一个数组实现两个堆栈的例子

简介: 顺序堆栈和链式堆栈的实现,用一个数组实现两个堆栈的例子

顺序堆栈的实现:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define ERROR -999
typedef int ElementType;
typedef int Position;
typedef struct SNode* PtrToNode;
struct SNode {
    ElementType *Data;    //存储元素的数组
    Position top;        //栈顶指针
    int MaxSize;        //堆栈最大容量
};
typedef PtrToNode Stack;
//生成一个空栈
Stack CreateStack(int MaxSize)
{
    Stack S = (Stack)malloc(sizeof(struct SNode));
    S->Data = (ElementType*)malloc(sizeof(sizeof(struct SNode) * MaxSize));
    S->top = -1;
    S->MaxSize = MaxSize;
    return S;
}
//判断一个栈是否已满
bool IsFull(Stack S)
{
    return S->top == S->MaxSize - 1;
}
//判断一个栈是否为空
bool IsEmpty(Stack S)
{
    return S->top == -1;    //这里我已开始写成了return S->top = -1;所以一直得不到正确结果
}
//压栈,返回是否压栈成功
bool Push(Stack S, ElementType X)
{
    if (IsFull(S))
    {
        printf("The stack is full!\n");
        return false;
    }
    else
    {
        S->Data[++(S->top)] = X;
        return true;
    }
}
//出栈,弹栈,返回弹出的元素
ElementType Pop(Stack S)
{
    if (IsEmpty(S))
    {
        printf("The Stack is Empty!\n");
        return ERROR;
    }
    else
        return (S->Data[(S->top)--]);
}
刚开始对Pop操作的返回值语句return (S->Data[(S->top)--]);存在一点疑惑,为什么程序已经把S->Data[S->top]返回回去了,
S->top还会执行自减操作(我一直认为后置版本的--运算符执行的操作是,先返回-1前的原值,再原值-1),事实上这个运算符是先把原值拷贝一份,然后原值-1,
最后返回副本,所以这条返回语句是没有问题的,因为返回副本之前原值就已经-1了

--运算符的重载实现为:

1 ClassA operator -- (int a)        //为了与前置版本相区别,参数列表中加上int a,但是int a在函数体中不起任何作用,只起区分的作用
2 {
3     ClassA copy = *this;
4     --*this;            //先自加
5     return copy;        //再返回前置版本
6 }

链式堆栈的实现:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <stdbool.h>
 4 
 5 #define ERROR -999
 6 
 7 typedef int ElementType;
 8 typedef struct SNode* PtrToSNode;
 9 struct SNode {
10     ElementType Data;
11     PtrToSNode Next;
12 };
13 
14 typedef PtrToSNode Stack;
15 
16 Stack CreateStack()
17 {
18     Stack S = (Stack)malloc(sizeof(struct SNode));
19     S->Next = NULL;
20     return S;
21 }
22 
23 bool IsEmpty(Stack S)
24 {
25     return (S->Next == NULL);
26 }
27 
28 bool Push(Stack S, ElementType X)
29 {
30     PtrToSNode TmpCell;
31 
32     TmpCell = (PtrToSNode)malloc(sizeof(struct SNode));
33     TmpCell->Data = X;
34     TmpCell->Next = S->Next;
35     S->Next = TmpCell;
36     return true;
37 }
38 
39 ElementType Pop(Stack S)
40 {
41     PtrToSNode FirstCell;
42     ElementType TopElem;
43     if (IsEmpty(S))
44     {
45         printf("Stack is empty!\n");
46         return ERROR;
47     }
48     else
49     {
50         FirstCell = S->Next;
51         TopElem = FirstCell -> Data;
52         S->Next = FirstCell->Next;
53         free(FirstCell);
54         return TopElem;
55     }
56 }
57 
58 int main()
59 {
60     Stack S = CreateStack();
61     Push(S, 3);
62     int a = Pop(S);
63     printf("%d\n", a);
64     return 0;
65 
66 }

用一个数组实现两个堆栈的例子:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <stdbool.h>
 4 
 5 #define ERROR -999
 6 
 7 typedef int ElementType;
 8 typedef int Position;
 9 typedef struct SNode* PtrToNode;
10 struct SNode {
11     ElementType *Data;    //存储元素的数组
12     Position top1;        //栈顶指针
13     Position top2;
14     int MaxSize;        //堆栈最大容量
15 };
16 typedef PtrToNode Stack;
17 
18 //生成一个空栈
19 Stack CreateStack(int MaxSize)
20 {
21     Stack S = (Stack)malloc(sizeof(struct SNode));
22     S->Data = (ElementType*)malloc(sizeof(sizeof(struct SNode) * MaxSize));
23     S->top1 = -1;
24     S->top2 = MaxSize;
25     S->MaxSize = MaxSize;
26     return S;
27 }
28 
29 
30 //压栈,返回是否压栈成功
31 bool Push(Stack S, ElementType X, int Tag)
32 {
33     if (S->top2 - S->top1 == 1)
34     {
35         printf("The stack is full!\n");
36         return false;
37     }
38     else
39     {
40         if (Tag == 1)
41             S->Data[++(S->top1)] = X;
42         else
43             S->Data[--(S->top2)] = X;
44         return true;
45     }
46 }
47 
48 //出栈,弹栈,返回弹出的元素
49 ElementType Pop(Stack S, int Tag)
50 {
51     if (Tag == 1)
52     {
53         if (S->top1 == -1)
54         {
55             printf("The Stack is Empty!\n");
56             return ERROR;
57         }
58         else
59             return S->Data[(S->top1)--];
60     }
61     else
62     {
63         if (S->top2 == S->MaxSize)
64         {
65             printf("Stack 2 is empty!\n");
66             return ERROR;
67         }
68         else
69             return S->Data[(S->top2)++];
70     }
71 }
72 
73 
74 int main()
75 {
76     Stack S = CreateStack(10);
77     Push(S, 2, 1);
78     int a = Pop(S, 1);
79     Push(S, 3, 2);
80     int b = Pop(S, 2);
81     printf("%d %d\n", a, b);
82     return 0;
83 }


相关文章
|
6月前
|
存储 安全 编译器
C/C++面试题:堆栈的作用
C/C++面试题:堆栈的作用
51 0
|
11月前
|
存储 算法 C++
堆栈数据结构(介绍与程序)
堆栈数据结构(介绍与程序)
83 0
|
存储 算法 C语言
5.堆栈算法
5.堆栈算法
|
存储 Java
堆栈的区别是什么
堆和栈是计算机内存中两种不同的数据结构,它们用来存储程序运行时所需的数据。虽然堆和栈都是用于存储数据的,但它们在内存管理和数据访问方面有着明显的区别。下面我将详细解释堆和栈的区别。
226 0
使用两个栈实现队列,简单例子
使用两个栈实现队列,简单例子
123 0
使用两个栈实现队列,简单例子
彻底弄懂为什么不能把栈上分配的数组(字符串)作为返回值
彻底弄懂为什么不能把栈上分配的数组(字符串)作为返回值
1288 0
|
存储 Linux 程序员
函数调用中堆栈的个人理解【转】
转自:http://www.cnblogs.com/MyLove-Summer/p/5034209.html 这是我的第一篇博客,由于公司项目需要,将暂时告别C语言一段时间。所以在此记录一下自己之前学习C语言的一些心得体会,希望可以分享给大家,也可以记录下自己学习过程中遇到的问题以及存在的疑惑(其实就是自己学习过程中不解的地方)。
1203 0
|
NoSQL C++ C语言
C/C++中手动获取调用堆栈【转】
转自:http://blog.csdn.net/kevinlynx/article/details/39269507 版权声明:本文为博主原创文章,未经博主允许不得转载。 当我们的程序core掉之后,如果能获取到core时的函数调用堆栈将非常有利于定位问题。
1114 0