C++實(shí)現(xiàn)棧的操作(push和pop)
棧的操作(push和pop)
棧的組織形式
如上圖所示:棧也是有多個(gè)數(shù)據(jù)節(jié)點(diǎn)組成的,每個(gè)節(jié)點(diǎn)包含有數(shù)據(jù)域和指向下一個(gè)節(jié)點(diǎn)的指針域。并且每次的push、pop和判空都是操作的棧頂指針top。
棧中每個(gè)數(shù)據(jù)節(jié)點(diǎn)的定義
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; }
棧應(yīng)用之進(jìn)制轉(zhuǎn)換
MyStack.h
#ifndef MYSTACK_H #define MYSTACK_H #include <iostream> using namespace std; template <typename T> class MyStack { public: ? ? MyStack(int size); ? ? ? ? ?//分配內(nèi)存初始化空間,設(shè)定棧容量,棧頂 ? ? ~MyStack(); ? ? ? ? ? ? ? ? ? ?//回收??臻g內(nèi)存 ? ? bool stackEmpty(); ? ? ? ? ?//判定棧是否為空,為空返回true,非空返回false ? ? bool stackFull(); ? ? ? ? ? //判定棧是否為滿,為滿返回true,不滿返回false ? ? void clearStack(); ? ? ? ? ?//清空棧 ? ? int stackLength(); ? ? ? ? ?//已有元素的個(gè)數(shù) ? ? bool push(T elem); ? ? ? ? ?//元素入棧,棧頂上升 ? ? bool pop(T &elem); ? ? ? ? ?//元素出棧,棧頂下降 ? ? void stackTraverse(bool isFromButtom); ? ? ?//遍歷棧中所有元素 private: ? ? T *m_pBuffer; ? ? ? ? ? ? ? //??臻g指針 ? ? int m_iSize; ? ? ? ? ? ? ? ?//棧容量 ? ? int m_iTop; ? ? ? ? ? ? ? ? //棧頂,棧中元素個(gè)數(shù) }; 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; }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
總結(jié)IOS中nil、Nil、NULL和NSNull區(qū)別
相信有不少朋友想知道,在 Objective-C 中 nil 和 Nil 以及 NULL 的區(qū)別。最重要的是,在面試中還有不少朋友常會(huì)被問到。現(xiàn)在小編在這里統(tǒng)一詳細(xì)說明。2016-08-08Qt實(shí)現(xiàn)簡易秒表設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)簡易秒表設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08C語言實(shí)現(xiàn)天氣信息管理系統(tǒng)
這篇文章主要介紹了C語言實(shí)現(xiàn)天氣信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06C語言編程銀行ATM存取款系統(tǒng)實(shí)現(xiàn)源碼
這篇文章主要為大家介紹了C語言編程銀行ATM存取款系統(tǒng)實(shí)現(xiàn)的源碼示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11C++類與對(duì)象及構(gòu)造函數(shù)析構(gòu)函數(shù)基礎(chǔ)詳解
這篇文章主要為大家介紹了C++類與對(duì)象及構(gòu)造函數(shù)析構(gòu)函數(shù)基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04采用C++實(shí)現(xiàn)區(qū)間圖著色問題(貪心算法)實(shí)例詳解
這篇文章主要介紹了采用C++實(shí)現(xiàn)區(qū)間圖著色問題(貪心算法),很經(jīng)典的算法問題,需要的朋友可以參考下2014-07-07