Seq_stack.h:
[cpp] view plain copy print?
- /*=============================================================================
- #
- # Author: liangshu - cbam
- #
- # QQ : 756029571
- #
- # School : 哈尔滨理工大学
- #
- # Last modified: 2015-10-26 20:34
- #
- # Filename: 链栈的实现 - 副本 (4).cpp
- #
- # Description:
- # The people who are crazy enough to think they can change the world, are the ones who do !
- =============================================================================*/
- #
- using namespace std;
- typedef int Node_entry;
- typedef int Stack_entry;
- enum Error_code {overflow, underflow, success};
- struct Node{
- Node_entry Entry;
- Node *next;
- Node();
- Node(Node_entry item, Node *add_on = NULL)//:Entry(item), next(NULL){}
- {
- Entry = item;
- next = add_on;
- }
- };
- class Stack{
- public:
- Stack();
- bool Empty()const;
- Error_code Push(const Stack_entry &item);
- Error_code Pop();
- Error_code Top(Stack_entry &item)const;
- void operator = (const Stack &original);
- Stack(const Stack &original);
- void Print_stack()const;
- ~Stack();
- protected:
- Node*top_node;
- };
- Node::Node(){
- next = NULL;
- }
- Stack::Stack(){
- top_node = NULL;
- }
- bool Stack :: Empty()const{
- if(top_node == NULL){
- return true;
- }
- return false;
- }
- Error_code Stack::Push(const Stack_entry &item){
- Node *new_top = new Node(item, top_node);
- if(new_top == NULL){
- return overflow;
- }
- top_node = new_top;
- return success;
- }
- Error_code Stack::Pop(){
- Node *old_top = top_node;
- if(top_node == NULL){
- return underflow;
- }
- top_node = top_node -> next;
- delete old_top;
- return success;
- }
- Error_code Stack::Top(Stack_entry &item)const{
- if(top_node == NULL){
- return underflow;
- }
- item = top_node -> Entry;
- return success;
- }
- void Stack::operator = (const Stack &original){
- Node *new_top, *new_copy, *original_node = original.top_node;
- if(original_node == NULL){
- new_top = NULL;
- }
- else{
- new_top = new_copy = new Node(original_node -> Entry);
- while(original_node -> next != NULL){
- original_node = original_node -> next;
- new_copy -> next = new Node(original_node -> Entry);
- new_copy = new_copy -> next;
- }
- }
- //最好清空调用对象,然后再给他挂上栈顶指针。
- while(! Empty()){
- Pop();
- }
- top_node = new_top;
- }
- Stack::Stack(const Stack &original){
- Node *new_copy, *original_node = original.top_node;
- if(original_node == NULL){
- top_node = NULL;
- }
- else{
- top_node = new_copy = new Node(original_node -> Entry);
- while(original_node -> next != NULL){
- original_node = original_node -> next;
- new_copy -> next = new Node(original_node -> Entry);
- new_copy = new_copy -> next;
- }
- }
- }
- void Stack::Print_stack()const{
- Node *new_top = top_node;
- cout<<"top <- ";
- while(new_top != NULL){
- cout<<new_top -> Entry<<" <- ";
- new_top = new_top -> next;
- }
- cout<<"bottom"<<endl;
- }
- //以下两个析构函数从意义上来说是一样的
- //一个栈对象为空,意味着数据成员top_node == NULL.
- Stack::~Stack(){
- while(top_node != NULL){
- Pop();
- }
- }
- Stack::~Stack(){
- while(!Empty()){
- Pop();
- }
- }
Test.cpp:
[cpp] view plain copy print?
- #
- #include<iostream>
- #include"Seq_stack.h"
- using namespace std;
- void test(Stack &stack_copy){
- stack_copy.Print_stack();
- }
- int main(){
- Stack stack_1, stack_2, stack_3, stack_4;
- for(int i = 1; i <= 4; i++){
- stack_1.Push(i);
- }
- stack_1.Print_stack();
- int x;stack_1.Top(x);
- cout<<x<<endl;
- stack_1.Pop();
- stack_1.Top(x);
- cout<<x<<endl;
- stack_2 = stack_1;
- stack_1.Print_stack();
- stack_2.Print_stack();
- stack_3 = stack_2;//调用重载函数(完全拷贝)
- test(stack_3);
- stack_4 = Stack(stack_2);//调用拷贝构造函数(完全拷贝)
- stack_4.Print_stack();
- return 0;
- }