栈的C++实现(数组)——创建-push-pop-top-清空栈-处理栈

今天学习了利用数组方式的栈的C++实现,这种方式跟指针实现有很多不一样的地方:

栈的指针实现,栈的创建申请头结点,push需要申请新的结点,pop释放结点,这些结点都放在第一个位置,top时,S->next->data即可。

栈的数组实现,只申请一个结点,该结点的结构体内包含,数组的最大容量、栈顶元素下标、指向整形数组的指针(用于存放和删除新的元素)。

S->topOfStack == -1,空栈;

S->topOfStack == S->capacity - 1,满栈;

1、声明结点

1     struct Node
2     {
3         int capacity;    //数组的最大容量
4         int topOfStack;  //栈顶为-1表示空栈,栈顶元素下标,每次添加新的元素,栈顶元素下标加1
5         int *Array;         //指向整形数组的指针
6     };
7     typedef struct Node stack;

2、空栈,满栈判断

1 int stackArray::isEmpty(stack *S)
2 {
3     return S->topOfStack == emptyTOS;
4 }
5 int stackArray::isFull(stack *S)
6 {
7     return S->topOfStack == S->capacity - 1;
8 }

3、创建栈

 1 stackArray::stack *stackArray::createStack(int maxElements)
 2 {
 3     if (maxElements < minStackSize)
 4         cout << "the space of stack is too short,please increase value of maxElements!" << endl;
 5
 6     stack *S;
 7     S = (stack*)new(stack);
 8     if (S == NULL)
 9         cout << "Out of space! " << ‘\n‘;
10
11     S->Array = new int[maxElements];
12     if (S->Array == NULL)
13         cout << "Out of space! " << ‘\n‘;
14
15     S->topOfStack = emptyTOS;
16     makeEmpty(S);
17     return S;
18 }

4、清空,处理栈

 1 void stackArray::makeEmpty(stack *S)
 2 {
 3     if (S->topOfStack == emptyTOS)
 4         cout << "Donnot need to empty stack! " << ‘\n‘;
 5     else
 6         S->topOfStack = emptyTOS;    //栈顶元素置-1,表示空栈
 7 }
 8
 9 void stackArray::disposeStack(stack *S)
10 {
11     while (S != NULL)
12     {
13         free(S->Array);  //释放数组首地址即可
14         free(S);
15     }
16 }

5、push,top,pop

 1 stackArray::stack *stackArray::push(stack *S)
 2 {
 3     if (isFull(S))
 4     {
 5         cout << "stack is full!" << endl;
 6         return 0;
 7     }
 8     int x = 0;
 9     cout << "Please input the data to push: " << endl;
10     scanf_s("%d", &x);
11     S->Array[++S->topOfStack] = x;
12     return S;
13 }
14 int stackArray::top(stack *S)
15 {
16     if (isEmpty(S))        //非空判断
17     {
18         cout << "empty stack! " << endl;
19         return -1;
20     }
21     else
22         return S->Array[S->topOfStack];
23 }
24 stackArray::stack *stackArray::pop(stack *S)
25 {
26     if (isEmpty(S))        //非空判断
27     {
28         cout << "empty stack! " << endl;
29         return 0;
30     }
31     else
32     {
33         S->topOfStack--;
34         return S;
35     }
36 }

6、主函数

 1 int main(int argc, char * argv[])
 2 {
 3     cout << ‘\n‘ << "***************************************" << ‘\n‘ << ‘\n‘;
 4     cout << "Welcome to the stackArray world! " << ‘\n‘;
 5     cout << ‘\n‘ << "***************************************" << ‘\n‘ << ‘\n‘;
 6
 7     int i = 1;
 8     int j = 0;
 9     int topElement = 0;
10     stackArray *a = new stackArray;
11     stackArray::stack *S = NULL;
12     //int x = 0;
13     while (i)
14     {
15         cout << ‘\n‘ << "***************************************" << ‘\n‘;
16         cout << " 0 : end the stack " << ‘\n‘;
17         cout << " 1 : creat a stack " << ‘\n‘;
18         cout << " 2 : display the top element of stack  " << ‘\n‘;
19         cout << " 3 : push a node in the stack  " << ‘\n‘;
20         cout << " 4 : pop a node from the stack  " << ‘\n‘;
21         cout << "***************************************" << ‘\n‘;
22         cout << "Please input the function your want with the number above : " << ‘\n‘;
23         scanf_s("%d", &j);
24
25         switch (j)
26         {
27         case 1:
28             cout << "CreatStack now begin : ";
29             S = a->createStack(5);
30             break;
31         case 2:
32             topElement = a->top(S);
33             cout << "The top element of stack is : " << topElement;
34             break;
35         case 3:
36             cout << "push now begin : ";
37             S = a->push(S);
38             break;
39         case 4:
40             cout << "pop now begin : ";
41             S = a->pop(S);
42             break;
43         default:
44             cout << "End the stack. ";
45             a->disposeStack(S);
46             i = 0;
47             break;
48         }
49
50     }
51
52     return 0;
53 }

效果展示

时间: 2024-08-09 23:52:46

栈的C++实现(数组)——创建-push-pop-top-清空栈-处理栈的相关文章

Android For JNI(四)——C的数组,指针长度,堆内存和栈内存,malloc,学生管理系统

Android For JNI(四)--C的数组,指针长度,堆内存和栈内存,malloc,学生管理系统 好几天每写JNI了,现在任务也越来越重了,工作的强度有点高,还有好几个系列的博客要等着更新,几本书还嗷嗷待哺的等着我去看,github上的两个散漫的开源,基础入门的视频也在录制,还要学习新的知识, 都是一种挑战,不知道为何,最近懒散了,看来还得再加把劲,今天我们继续延伸一下C的一些小知识 一.数组 C的数组和JAVA也是类似的,我们写一段小程序 #include <stdio.h> #inc

顺序栈:创建&amp;初始化、入栈、出栈、计算栈中有效数据长度、获取栈顶数据、清空栈、销毁栈

/*    顺序栈的实现:    初始化    入栈    出栈    计算栈的有效数据长度    获取栈顶数据    清空栈    销毁栈*/ #include <stdio.h>#include <stdlib.h> #define ElemType int typedef struct __stackInfo{    ElemType *data;    unsigned int top;    unsigned int capacity;} stackInfo;/* 初始化

说明如何用一个数组A[1...n]来实现两个栈,使得两个栈中的元素总数不到n时,两者都不会发生上溢。注意PUSH和POP操作的时间应为O(1)。

校招开始了,发现自己数据结构,Algorithms的知识都还给老师了.喵了个呜的! <算法导论>开啃吧~ 从第三章数据结构开始吧~ 10.1-2 : 如何用一个数组A[1...n]来实现两个栈,使得两个栈中的元素总数不到n时,两者都不会发生上溢.注意PUSH和POP操作的时间应为O(1). 解:思想是,建一维数组,两个栈stack1和stack2分别从数组A[0]和A[N-1]开始push,栈指针相遇时,两个栈中元素总数为n. 在思考怎么用java 实现,晚些时候 上代码吧~

js 的数组怎么push一个对象. Js数组的操作push,pop,shift,unshift JavaScript使用push方法添加一个元素到数组末 JavaScript数组函数unshift、shift、pop、push使用

push()函数用于向当前数组的添加一个或多个元素,并返回新的数组长度.新的元素将会依次添加到数组的末尾. 该函数属于Array对象,所有主流浏览器均支持该函数. 语法 array.push( item1 [,items... ] )参数 参数 描述item1 任意类型添加到当前数组末尾处的元素.items 可选参数/任意类型要添加到当前数组末尾处的其他项,可以有多个.注意:如果添加的元素类型为数组类型(Array),仍然会被当作一个元素看待,只是这个元素是数组类型而已.如果要合并两个数组,请使

Js数组的操作push,pop,shift,unshift等方法详细介绍

js中针对数组操作的方法还是比较多的,今天突然想到来总结一下,也算是温故而知新吧.不过不会针对每个方法进行讲解,我只是选择其中的一些来讲. 首 先来讲一下push和pop方法,这两个方法只会对数组从尾部进行压入或弹出,而且是在原数组进行操作,任何的改动都是会影响到操作的数组. push(args)可以每次压入多个元素,并返回更新后的数组长度.pop()函数每次只会弹出最后一个结尾的元素,并返回弹出的元素,如果是对空组数 调用pop()则返回undefined. 如果参数是数组则是将整个数组当做一

js 的数组怎么push一个对象. Js数组的操作push,pop,shift,unshift JavaScrip

push()函数用于向当前数组的添加一个或多个元素,并返回新的数组长度.新的元素将会依次添加到数组的末尾. 该函数属于Array对象,所有主流浏览器均支持该函数. 语法 array.push( item1 [,items... ] )参数 参数 描述item1 任意类型添加到当前数组末尾处的元素.items 可选参数/任意类型要添加到当前数组末尾处的其他项,可以有多个.注意:如果添加的元素类型为数组类型(Array),仍然会被当作一个元素看待,只是这个元素是数组类型而已.如果要合并两个数组,请使

[ExtJS5学习笔记]第二十节 Extjs5配合数组的push方法,动态创建并加载组件

本文地址:http://blog.csdn.net/sushengmiyan/article/details/39226773 官方例子:http://docs.sencha.com/extjs/5.0/apidocs/#!/api/Array-method-push 本文作者:sushengmiyan -------------------------------------------------------------------------------------------------

剑指offer-第二章数据结构(数组,字符串,链表,树,栈与队列)及例题

一.数组(最简单的数据结构) 定义:占据一块连续内存并按照顺序存储数据.创建时先指定大小,分配内存. 优点:时间效率高.实现简单的hash(下标为key,对应的数据为value) 缺点:空间效率差.如果我们只在数组中存一个数字,也先分配所有的内存. 扩展:动态数组(解决空间效率差),手段:扩容后,复制内容到新的数组,释放之前的内存.时间性能变差,因此,要尽量减少改变数组容量的次数. 数组与指针:声明一个数组时,数组名字也是一个指针,指向数组的第一个元素. 例题:在一个二维数组中,每一行都按照从左

mongodb_修改器($inc/$set/$unset/$push/$pop/upsert......)

对于文档的更新除替换外,针对某个或多个文档只需要部分更新可使用原子的更新修改器,能够高效的进行文档更新.更新修改器是中特殊的键,用来指定复杂的操作,比如增加.删除或者调整键,还可能是操作数组或者内嵌文档. 1.$inc--------------------------------------------------------------------------这个修改器干什么使的呢?看看下面示例的具体操作后的结果即可知道. 示例文档:{"uid":"201203"