forked from wangzheng0822/algo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request wangzheng0822#57 from mvpcaozixiang/master
顺序栈与链式栈CPP实现。
- Loading branch information
Showing
4 changed files
with
289 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
127
c-cpp/08_stack/StackBasedOnLinkedList/StackBasedOnLinkedList.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
20
c-cpp/08_stack/StackBasedOnLinkedList/StackBasedOnLinkedList.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; // 单链表的头指针,不带头节点 | ||
}; |