C++实现栈的操作(push和pop)

目录
  • 栈的操作(push和pop)
    • 栈的组织形式
    • 栈中每个数据节点的定义
    • 栈的类的定义
    • 栈的push操作
  • 栈应用之进制转换

栈的操作(push和pop)

栈的组织形式

如上图所示:栈也是有多个数据节点组成的,每个节点包含有数据域和指向下一个节点的指针域。并且每次的push、pop和判空都是操作的栈顶指针top。

栈中每个数据节点的定义

class data_node{
public:
	data_node() :data(0), next(NULL){}//default constructer function
	data_node(int value) :data(value), next(NULL){}//include arg constructer function
	int data;
	data_node *next;//pointer that point to next node
};

栈的类的定义

class my_stack{
public:
	my_stack() :top(NULL){}
	void push(data_node new_data);
	void pop(data_node *pop_node);
	bool empty();
	data_node *top;
};

栈的push操作

void my_stack::push(data_node new_data)
{
	data_node *pnode = NULL;
	pnode = new data_node(new_data.data);
	pnode->next = top;
	top = pnode;
}

void my_stack::pop(data_node *pop_node)
{
	if (empty())
	{
		printf("this stack is empty\n");
		return;
	}
	pop_node->data = top->data;
	data_node *pnode = top;
	top = top->next;
	delete pnode;
}

bool my_stack::empty()
{
	return (top == NULL);
}

完整的代码如下:

#include "stdafx.h"
#include <iostream>
#pragma warning(disable:4996)
#include <string>

using namespace std;

class data_node{
public:
	data_node() :data(0), next(NULL){}//default constructer function
	data_node(int value) :data(value), next(NULL){}//include arg constructer function
	int data;
	data_node *next;//pointer that point to next node
};

class my_stack{
public:
	my_stack() :top(NULL){}
	void push(data_node new_data);
	void pop(data_node *pop_node);
	bool empty();
	data_node *top;
};

void my_stack::push(data_node new_data)
{
	data_node *pnode = NULL;
	pnode = new data_node(new_data.data);
	pnode->next = top;
	top = pnode;
}

void my_stack::pop(data_node *pop_node)
{
	if (empty())
	{
		printf("this stack is empty\n");
		return;
	}
	pop_node->data = top->data;
	data_node *pnode = top;
	top = top->next;
	delete pnode;
}

bool my_stack::empty()
{
	return (top == NULL);
}

int main()
{
	data_node pop_node(0);
	my_stack stack;
	stack.push(3);
	stack.push(2);
	stack.push(6);//3,2,6
	stack.pop(&pop_node);
	//printf("is empty? %d\n", stack.empty());
	printf("%2d ", pop_node.data);
	stack.pop(&pop_node);
	//printf("is empty? %d\n", stack.empty());
	printf("%2d ", pop_node.data);
	stack.pop(&pop_node);
	printf("%2d\n ", pop_node.data);
	printf("is empty? %d\n", stack.empty());
	return 0;
}

栈应用之进制转换

MyStack.h

#ifndef MYSTACK_H
#define MYSTACK_H
#include <iostream>
using namespace std;
template <typename T>
class MyStack
{
public:
    MyStack(int size);          //分配内存初始化空间,设定栈容量,栈顶
    ~MyStack();                    //回收栈空间内存
    bool stackEmpty();          //判定栈是否为空,为空返回true,非空返回false
    bool stackFull();           //判定栈是否为满,为满返回true,不满返回false
    void clearStack();          //清空栈
    int stackLength();          //已有元素的个数
    bool push(T elem);          //元素入栈,栈顶上升
    bool pop(T &elem);          //元素出栈,栈顶下降
    void stackTraverse(bool isFromButtom);      //遍历栈中所有元素
private:
    T *m_pBuffer;               //栈空间指针
    int m_iSize;                //栈容量
    int m_iTop;                 //栈顶,栈中元素个数
};
template <typename T>
MyStack<T>::MyStack(int size)
{
    m_iSize = size;
    m_pBuffer = new T[size];
    m_iTop = 0;
}
template <typename T>
MyStack<T>::~MyStack()
{
    delete[]m_pBuffer;
    m_pBuffer = NULL;
}
template <typename T>
bool MyStack<T>::stackEmpty()
{
    if (0 == m_iTop)
    {
        return true;
    }
    else
    {
        return false;
    }
}
template <typename T>
bool MyStack<T>::stackFull()
{
    if (m_iTop == m_iSize)
    {
        return true;
    }
    else
    {
        return false;
    }
}
template <typename T>
void MyStack<T>::clearStack()
{
    m_iTop = 0;
}
template <typename T>
int MyStack<T>::stackLength()
{
    return m_iTop;
}
template <typename T>
bool MyStack<T>::push(T elem)
{
    if(!stackFull())
    {
        m_pBuffer[m_iTop] = elem;
        m_iTop++;
        return true;
    }
    else
    {
        return false;
    }
}
template <typename T>
bool MyStack<T>::pop(T &elem)
{
    if (!stackEmpty())
    {   
        m_iTop--;
        elem = m_pBuffer[m_iTop];
        return true;
    }
    else
    {
        return false;
    }
}
template <typename T>
void MyStack<T>::stackTraverse(bool isFromButtom)
{
    if (isFromButtom)
    {
        for (int i = 0; i < m_iTop; i++)
        {
            cout << m_pBuffer[i];
        }
    }
    else 
        for (int i = m_iTop -1; i >= 0; i--)
        {
            cout << m_pBuffer[i];
        }
    cout << endl;
}
#endif MYSTACK_H

main.cpp

#include "MyStack.h"
#define BINARY      2
#define OCTONSRY    8
#define HEXADECTMAL 16
int main()
{
    char num[] = "0123456789ABCDEF";
    MyStack<char> *pStack = new MyStack<char>(50);
    int N = 0;
    cin >> N;
    int mod = 0;
    while (N != 0)
    {
        mod = N % HEXADECTMAL;
        pStack->push(num[mod]);
        N = N / HEXADECTMAL;
    }
    pStack->stackTraverse(false);
    delete pStack;
    pStack = NULL;
    system("pause");
    return 0;
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 手把手带你了解C++最小栈

    目录 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. 示例: 输入: 输出: 解释: 思路 总结 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- 获取栈顶元素. getMin() -- 检索栈中的最小元素. 示例: 输入: ["MinStack","push","push&quo

  • C++ push方法与push_back方法的使用与区别

    [摘要] push与push_back是STL中常见的方法,都是向数据结构中添加元素.初识STL,对于添加元素的方法以产生混淆,这里暂对两种方法作出比较分析.此外,本文还将简述push对应的stack与queue系列,常见方法的介绍,以及与push_back相对应的vector系列常见方法介绍.详见下文. list 也是使用 push_back . [正文] push_back 方法介绍 vector::void push_back (const value_type& val); vector

  • C++实现栈与分析栈的知识点

    目录 一.栈的概念 二.栈的基本组成和操作 三.栈元素的存储方式 四.C++实现静态栈 (1)栈类的设计 (1)isEmpty()判断是否为空 (2)isFull()判断是否已满 (3)push()压栈 (4)pop()出栈 (5)getTop()获取栈顶元素 (6)clear()清空栈 一.栈的概念 栈的英文为stack,译为一叠或者一摞.栈是一种采用先进后出FILO(first in last out)或称为后进先出LIFO(last in first out)策略进行元素访问的数据结构.栈

  • C++利用两个栈实现队列的方法

    1. 基础 队列:先进先出,即插入数据在队尾进行,删除数据在队头进行: 栈:后进先出,即插入与删除数据均在栈顶进行. 2. 思路 两个栈实现一个队列的思想:用pushStack栈作为push数据的栈,用popStack栈作为pop数据的栈. 只要是对队列进行push操作,就将数据push入pushStack栈中. 要实现队列的pop操作,有二点原则,如果popStack为空的话那么我们就将pushStack所有的元素放到popStack中,然后取popStack栈顶元素就是队列的队头:如果pop

  • C++实现栈的操作(push和pop)

    目录 栈的操作(push和pop) 栈的组织形式 栈中每个数据节点的定义 栈的类的定义 栈的push操作 栈应用之进制转换 栈的操作(push和pop) 栈的组织形式 如上图所示:栈也是有多个数据节点组成的,每个节点包含有数据域和指向下一个节点的指针域.并且每次的push.pop和判空都是操作的栈顶指针top. 栈中每个数据节点的定义 class data_node{ public: data_node() :data(0), next(NULL){}//default constructer

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

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

  • C语言数据结构之栈简单操作

    C语言数据结构之栈简单操作 实验: 编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能: (1)初始化顺序栈 (2)插入元素 (3)删除栈顶元素 (4)取栈顶元素 (5)遍历顺序栈 (6)置空顺序栈 分析: 栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表. 对于顺序栈,入栈时,首先判断栈是否为满,栈满的条件为:p->top= =MAXNUM-1,栈满时,不能入栈; 否则出现空间溢出,引起错误,这种现象称为上溢. 出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作

  • Python实现基本数据结构中栈的操作示例

    本文实例讲述了Python实现基本数据结构中栈的操作.分享给大家供大家参考,具体如下: #! /usr/bin/env python #coding=utf-8 #Python实现基本数据结构---栈操作 class Stack(object): def __init__(self,size): self.size = size self.stack = [] self.top = 0#初始化,top=0时则为空栈 def push(self,x): if self.stackFull():#进

  • JS数组方法push()、pop()用法实例分析

    本文实例讲述了JS数组方法push().pop()用法.分享给大家供大家参考,具体如下: push()方法 1. 定义:向数组的末尾添加一个或更多元素,并返回新的长度. 2. 语法: arr.push(element1, ..., elementN) 3. 参数:可以接收任意个数量的参数 4. 返回值:返回修改后数组的长度. var arr1 = [1, 2, 3, 4]; var arr2 = ["C", "B", "A"]; Array.pr

  • java 实现下压栈的操作(能动态调整数组大小)

    我就废话不多说了,大家还是直接看代码吧~ import java.util.Iterator; public class ResizingArrayStack<Item> implements Iterable<Item> { private Item[] a=(Item[]) new Object[1]; private int N=0; public boolean isEmpty() { return N==0;} public int size() {return N;}

  • 数据结构 栈的操作实例详解

    数据结构 栈的操作实例详解 说明: 往前学习数据结构,想运行一个完整的顺序栈的程序都运行不了,因为书上给的都是一部分一部分的算法,并没有提供一个完整可运行的程序,听了实验课,自己折腾了一下,总算可以写一个比较完整的顺序栈操作的小程序,对于栈也慢慢开始有了感觉.下面我会把整个程序拆开来做说明,只要把这些代码放在一个文件中,用编译器就可以直接编译运行了. 一.实现 1.程序功能 关于栈操作的经典程序,首当要提及进制数转换的问题,利用栈的操作,就可以十分快速地完成数的进制转换. 2.预定义.头文件导入

  • iOS逆向工程之Hopper中的ARM指令详解

    虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是可以的.虽然当时感觉学这门课以后似乎不怎么用的上,可曾想这不就用上了吗,不过之前学的都差不多忘了,还得捡起来呢.ARM指令集是精简指令集,从名字我们就能看出指令的个数比那些负责指令集要少一些.当然本篇所涉及的ARM指令集是冰山一角,不过也算是基础,可以阅读Hopper中的汇编了,实践出真知,看多了自

  • Vue.js中该如何自己维护路由跳转记录

    前言 在Vue的项目中,如果我们想要做返回.回退操作时,一般会调用router.go(n)这个api,但是实际操作中,使用这个api有风险,就是会让用户跳出当前应用,因为它记录的是浏览器的访问记录,而不是你当前应用的访问记录,这是非常可怕的事情. 解决方案就是,我们自己来维护一份history跳转记录. 案例与使用场景 代码地址:https://github.com/dora-zc/mini-vue-mall (本地下载) 这是一个基于Vue.js的小型商城案例,应用场景: 自己实现一个Vue插

  • 汇编语言存储及寄存器原理解析

    这篇文章主要介绍了汇编语言存储及寄存器原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 字的存储 一个16位寄存器可以存放一个字(16位)或者一个字节(8位),当存放一个字节的时候只需要一个内存单元(内存单元是以字节为单位的,8位),而存放一个字需要两个内存单元,这样存放一个字就需要两个连续的内存单元,这个16位的字,高位存放在高地址,低位存放在低地址. 内存地址 内存数据 0 20H 1 4EH 2 12H 3 00H 对于字来说0就是

随机推荐