栈的操作(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
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;
- }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。