C++栈的操作(push和pop)
酸菜鱼的鱼 人气:4栈的操作(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; }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
加载全部内容