//栈、顺序栈、链式栈;单链表反转算法
#include<iostream>
using namespace std;
//template<class T>
//class Stack {
//public:
// void Clear();//清空
// bool Push(const T item);//压入
// bool Pop(T& item);//读取、删除栈顶元素
// bool Top(T& item);//读取栈顶元素
// bool IsEmpty();//判断是否为空
// bool IsFull();//判断是否已满
//};
template<class T>
class ArrayStack {
private:
int maxSize;
int top;
T* st;
public:
ArrayStack(int size) {
maxSize = size;
top = -1;
st = new T[maxSize];
}
~ArrayStack() {
delete[]st;
}
void Clear() {
top = -1;
}
bool Push(const T item) {
if (top == maxSize - 1) {
T* newst = new T[maxSize*2];
for (int i = 0; i < maxSize; i++)
newst[i] = st[i];
delete[]st;
st = newst;
maxSize *= 2;
}
st[++top] = item;
return true;
}
bool Pop(T& item) {
if (top == -1) {
cout << "栈为空,不能删除栈顶元素" << endl;
return false;
}
item = st[top--];
return true;
}
bool Top(T& item) {
if (top == -1) {
cout << "栈为空,不能读取栈顶元素" << endl;
return false;
}
item = st[top];
return true;
}
bool IsEmpty() {
if (top == -1)
return true;
return false;
}
bool IsFull() {
if (top == maxSize - 1)
return true;
return false;
}
};
template<class T>
class LinkNode {
public:
T data;
LinkNode<T>* link;;
LinkNode() {}
LinkNode(const T& el, LinkNode<T>* ptr = 0) {
data = el;
link = ptr;
}
};
template<class T>
class LinkStack {
private:
LinkNode<T>* top;
int size;
public:
LinkStack() {
top = NULL;
size = 0;
}
~LinkStack() {
Clear();
}
void Clear() {
while (top != NULL) {
LinkNode<T>* tmp = top;
top = top->link;
delete tmp;
}
size = 0;
}
bool Push(const T item) {
LinkNode<T>* tmp = new LinkNode<T>(item, top);
top = tmp;
size++;
return true;
}
bool Pop(T& item) {
LinkNode<T>* tmp;
if (size == 0) {
cout << "栈为空,不能删除栈顶元素" << endl;
return false;
}
item = top->data;
tmp = top;
top = top->link;
delete tmp;
size--;
return true;
}
bool Top(T& item) {
if (size == 0) {
cout << "栈为空,不能读取栈顶元素" << endl;
return false;
}
item = top->data;
return true;
}
bool IsEmpty() {
if (size == 0)
return true;
return false;
}
bool invert() {
LinkNode<T>* p = top, * q = NULL,*r=NULL;
while (p != NULL) {
r = q;
q = p;
p = p->link;
q->link = r;
}
top = q;
return true;
}
void show() {
LinkNode<T>* tmp = top;
while (tmp != NULL) {
cout << tmp->data << "\t";
tmp = tmp->link;
}
cout << endl;
}
};
int main() {
LinkStack<int> a;
for (int i = 0; i < 10; i++)
{
a.Push(i);
}
a.show();
a.invert();
a.show();
return 0;
}
shangji
最新推荐文章于 2024-06-05 15:16:22 发布