Skip to content

Commit

Permalink
Merge pull request wangzheng0822#57 from mvpcaozixiang/master
Browse files Browse the repository at this point in the history
顺序栈与链式栈CPP实现。
  • Loading branch information
wangzheng0822 authored Oct 15, 2018
2 parents 9b4dba5 + d69e3d1 commit fa29f55
Show file tree
Hide file tree
Showing 4 changed files with 289 additions and 0 deletions.
122 changes: 122 additions & 0 deletions c-cpp/08_stack/StackBasedOnArray/StackBasedOnArray.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
/**
* 1)顺序栈的操作:入栈和出栈;
* 2)采用模板的方法实现存储任意类型的数据
* 3)采用数组的栈,支持动态扩容,每次扩容1.5 倍,初始栈的大小是 10 。
*
* Author:caozx
* time ;2018年10月11日
*/

#include <iostream>
#include "StackBasedOnArray.h"
using namespace std;

//构造函数,创建栈
//类模板成员函数的写法 template<class T> 返回值类型 类名<T>::成员函数名(参数列表){}
template<class T> ArrayStack<T>::ArrayStack()
{
this -> count = 10;
this -> flag = 0;
this -> array = new T[this -> count];
if (! this -> array){
cout << "array malloc memory failure" << endl;
}
}


//有参构造函数,创建栈
template<class T> ArrayStack<T>::ArrayStack(int count)
{
this -> count = count;
this -> flag = 0;
this -> array = new T[this -> count];
if (! this -> array){
cout << "array malloc memory failure" << endl;
}
}

//析构函数,销毁栈
template <class T> ArrayStack<T>::~ArrayStack(){
this -> count = 0;
this -> flag = 0;
if(this -> array){
delete [] this -> array;
this -> array = NULL;
}

}

// 入栈
template<class T> void ArrayStack<T>::push(T data){
if(this -> flag == this -> count){
cout << "The stack is full , so need to enlarge 1.5x! "<< endl;
this -> count = int (1.5 * this -> count);
T * temp = new T [this -> count];
for(int i = 0; i < this -> flag ; i++){
temp[i] = this -> array[i];
//cout << temp[i] <<endl;
}
delete [] this -> array; //释放原来的空间
temp[this -> flag] = data;
this -> flag ++;
this -> array = temp;
}
else{
this -> array [this -> flag] = data;
this -> flag ++ ;
}
}

//出栈,并删除栈顶元素
template<class T> T ArrayStack<T>::pop(){
this -> flag --;
T temp = this -> array[this -> flag];
return temp;
}

//出栈,不删除栈顶元素
template<class T> T ArrayStack<T>::peek(){
T temp = this -> array[this -> flag - 1];
return temp;
}

template<class T> int ArrayStack<T>::stackSize(){
return this -> flag;
}

template<class T> int ArrayStack<T>::stackMaxSize(){
return this -> count;
}

int main(int argc, char const *argv[])
{
cout << " === test begin ===" << endl;
ArrayStack <int> arrstack(12);
arrstack.push(10);
arrstack.push(20);
arrstack.push(30);
arrstack.push(40);
arrstack.push(50);
arrstack.push(60);
arrstack.push(70);
arrstack.push(80);
arrstack.push(90);
arrstack.push(100);
arrstack.push(110);
arrstack.push(120);
arrstack.push(130);
arrstack.push(140);
arrstack.push(150);

cout << "peek , not delete " << arrstack.peek() << endl;
cout << "pop , delete " << arrstack.pop()<<endl;

arrstack.push(210);
arrstack.push(220);

cout << "peek , not delete " << arrstack.peek() << endl;
cout << "pop , delete " << arrstack.pop()<<endl;

system("pause");
return 0;
}
20 changes: 20 additions & 0 deletions c-cpp/08_stack/StackBasedOnArray/StackBasedOnArray.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@

// 类模板的声明(line 3),类模板实例化后就是模板类
// 类模板声明的写法 template <class T> class 类名{}
template <class T> class ArrayStack
{
public:
ArrayStack();
ArrayStack(int count);
~ArrayStack();
void push(T data); //入栈
T pop(); //出栈,并删除栈顶元素
T peek(); //返回栈顶元素,不删除栈顶元素,栈顶指针不变
int stackSize();
int stackMaxSize();

private:
int flag; //栈顶标签,指向栈顶
int count ; //栈的容量
T *array; //指针
};
127 changes: 127 additions & 0 deletions c-cpp/08_stack/StackBasedOnLinkedList/StackBasedOnLinkedList.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
/**
* 1)链式栈的操作:入栈,出栈以及返回栈的大小;
* 2)采用模板的方法实现存储任意类型的数据
* 3)采用单链表实现栈
* 4)pop和peek 出栈的返回值稍微有点问题,当栈为空的时候,返回null,cpp默认返回的是0。
* * 改进方法就是不用函数的返回值返回栈顶元素,而是采用参数列表的形式返回,这样稍微有点麻烦
* * 或者就是在使用的时候先调用size函数判断以下
* Author:caozx
* time ;2018年10月11日
*/

#include <iostream>
#include "StackBasedOnLinkedList.h"
using namespace std;

template<class T> LinkedListStack<T>::LinkedListStack()
{
this -> count = 0;
this -> head = new LinkedNode;
this -> head -> next = NULL;
}

template<class T> LinkedListStack<T>::~LinkedListStack()
{
LinkedNode * ptr, * temp;
ptr = head;
while(ptr -> next != NULL){
temp = ptr -> next;
ptr -> next = temp -> next;
delete temp;
}
delete head ; //删除头节点
this -> head = NULL;
this -> count = 0;
}

// 入栈
template<class T> void LinkedListStack<T>::push(const T & data)
{
LinkedNode * insertPtr = new LinkedNode;
insertPtr -> data = data;
insertPtr -> next = this -> head -> next;
head -> next = insertPtr;
this -> count ++;
cout << "push data : " << this -> head -> next -> data << endl;
}

//返回栈顶元素,即出栈,不删除栈顶元素
template<class T> T LinkedListStack<T>::peek()
{
if(this -> count == 0 || this -> head -> next == NULL){
cout << " stack is empty, peek fail"<< endl;
return NULL;
}
else{
return this -> head -> next -> data;
}
}

//出栈,删除栈顶元素
template<class T> T LinkedListStack<T>::pop()
{
if(this -> count == 0 || this -> head -> next == NULL){
cout << " stack is empty, pop fail"<< endl;
return NULL;
}
else{
LinkedNode * temp = this -> head -> next;
this -> head -> next = temp -> next;
T data = temp -> data;
delete temp;
this -> count --;
return data;
}

}

//返回栈的大小
template<class T> int LinkedListStack<T>::size() const
{
return this -> count;
}

int main(int argc, char const *argv[])
{
cout << " === StackBasedOnLinkedList test begin ===" << endl;
LinkedListStack <float> stack;
cout << "size==="<<stack.size()<<endl;
stack.push(10.1);
stack.push(20.2);
stack.push(30.);
stack.push(40.4);
stack.push(50.5);
stack.push(60.6);
cout << "size==="<<stack.size()<<endl;
cout << "stack peek " << stack.peek() << endl;
cout << "stack pop " << stack.pop() << endl;
cout << "size==="<<stack.size()<<endl;
cout << "stack pop " << stack.pop() << endl;
cout << "stack pop " << stack.pop() << endl;
cout << "stack pop " << stack.pop() << endl;
cout << "stack pop " << stack.pop() << endl;
cout << "stack pop " << stack.pop() << endl;
cout << "size==="<<stack.size()<<endl;
cout << "stack pop " << stack.pop() << endl;
cout << "stack peek " << stack.peek() << endl;
stack.push(110.1);
stack.push(120.2);
stack.push(130.3);
stack.push(140.4);
stack.push(150.5);
stack.push(160.6);
cout << "size==="<<stack.size()<<endl;
cout << "stack peek " << stack.peek() << endl;
cout << "stack pop " << stack.pop() << endl;
cout << "stack pop " << stack.pop() << endl;
cout << "stack pop " << stack.pop() << endl;
cout << "stack peek " << stack.peek() << endl; //peek
cout << "stack pop " << stack.pop() << endl;
cout << "stack pop " << stack.pop() << endl;
cout << "stack pop " << stack.pop() << endl;
cout << "size==="<<stack.size()<<endl;
cout << "stack peek " << stack.peek() << endl; //peek
cout << "stack pop " << stack.pop() << endl;
system("pause");
return 0;
}
20 changes: 20 additions & 0 deletions c-cpp/08_stack/StackBasedOnLinkedList/StackBasedOnLinkedList.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// 类模板的声明,关键字 class 也可以更换成 typename
template<class T> class LinkedListStack
{
public:
LinkedListStack();
~LinkedListStack();

void push(const T & data); //入栈
T peek(); //返回栈顶元素,即出栈,不删除栈顶元素
T pop(); //出栈,删除栈顶元素
int size() const; //返回栈的大小
private:
int count; //存放栈的大小,因为是单链表所以这里不规定栈的最大可承载量
struct LinkedNode
{
T data;
LinkedNode * next;
};
LinkedNode * head; // 单链表的头指针,不带头节点
};

0 comments on commit fa29f55

Please sign in to comment.