C++模板类实现顺序栈和链栈
实现的功能:
1.压栈,2.弹栈,3.显示栈顶元素,4.判空,5.判满,6.清空栈,7.求栈长度。
顺序栈的C++模板类实现代码:
//顺序栈*********************************************************************
#include <iostream>
using namespace std;
#define STACK_SIZE 10
template <class Stack>
class SeqStack
{
public:
SeqStack(){ top = -1; stack_sise = 0; }
~SeqStack(){}
void Push(Stack index);
void Pop();
Stack GetTop();
bool Empty(){ top == -1 ? return true : return false; }
bool Full(){ top > STACK_SIZE ? return true : return false; }
void clearStack(){ while (top + 1) { data[top] = 0; top--; stack_sise = 0; } }
int stack_sise;
private:
Stack data[STACK_SIZE];
int top;
};
template <class Stack>
void SeqStack<Stack>::Push(Stack index)
{
if (top == STACK_SIZE - 1) { std::cout << "栈已满,无法压栈" << std::endl; }
else { data[++top] = index; stack_sise++; }
}
template <class Stack>
void SeqStack<Stack>::Pop()
{
int Index = 0;
if (top == -1) std::cout << "栈已空,无法弹栈" << std::endl;
else
{
Index = data[top--];
stack_sise--;
std::cout << "已弹栈:" << Index << std::endl;
}
}
template <class Stack>
Stack SeqStack<Stack>::GetTop()
{
if (top == -1)
{
std::cout << "栈已空,栈顶无数据" << std::endl;
return -1;
}
else
{
std::cout << "栈顶:" << data[top] << std::endl;
return data[top];
}
}
int main()
{
SeqStack<int> stack;
int select = 10;
int Item = 0;
while (select)
{
std::cout << std::endl;
std::cout << "***************************" << std::endl;
std::cout << "[1]压栈 [2]弹栈 *" << std::endl;
std::cout << "[3]获取栈顶元素 [4]清空栈*" << std::endl;
std::cout << "[5]栈长度 *" << std::endl;
std::cout << "***************************" << std::endl;
cout << "请选择:>";
std::cin >> select;
switch (select)
{
case 1:
std::cout << "请输入要压入的值:>";
std::cin >> Item;
stack.Push(Item);
std::cout << Item << " 已入栈" << std::endl;
break;
case 2:
stack.Pop();
break;
case 3:
stack.GetTop();
break;
case 4:
stack.clearStack();
std::cout << "栈已清空" << std::endl;
break;
case 5:
std::cout << "栈长度:" << stack.stack_sise << std::endl;
break;
default:
break;
}
}
return 0;
}
链栈的C++模板类实现代码:
//链栈********************************************************************
#include <iostream>
using namespace std;
#define STACK_SIZE 100
template <class DataType>
class LinkStackNode
{
public:
DataType data;
LinkStackNode<DataType>* next;
};
template <class DataType>
class LinkStack
{
public:
int stack_sise;
LinkStack(){ top = 0; stack_sise = 0; }
~LinkStack(){}
void Push(DataType index);
void Pop();
DataType GetTop();
bool Empty(){ top == 0 ? return true : return false; }
bool Full(){ top > STACK_SIZE ? return true : return false; }
void clearStack();
private:
LinkStackNode <DataType> *top;
};
template <class DataType>
void LinkStack<DataType>::Push(DataType index)
{
LinkStackNode<DataType> *addNode = (LinkStackNode<DataType> *)malloc(sizeof(LinkStackNode<DataType>));
addNode->data = index;
addNode->next = top;
top = addNode;
stack_sise++;
}
template <class DataType>
void LinkStack<DataType>::Pop()
{
if (top == 0)
std::cout << "栈已空,无法弹栈" << std::endl;
else
{
DataType pop_x;
LinkStackNode<DataType> *pop_p;
pop_x = top->data;
pop_p = top;
top = top->next;
delete pop_p;
stack_sise--;
std::cout << "已弹栈:" << pop_x << std::endl;
}
}
template <class DataType>
DataType LinkStack<DataType>::GetTop()
{
if (top == 0)
{
std::cout << "栈已空,栈顶无数据" << std::endl;
return -1;
}
else
{
std::cout << "栈顶:" << top->data << std::endl;
return top->data;
}
}
template <class DataType>
void LinkStack<DataType>::clearStack()
{
while (top != 0)
{
DataType pop_x;
LinkStackNode<DataType> *pop_p;
pop_x = top->data;
pop_p = top;
top = top->next;
delete pop_p;
stack_sise = 0;
}
}
//主函数
int main()
{
LinkStack<int> stack;
int select = 10;
int Item = 0;
while (select)
{
std::cout << std::endl;
std::cout << "***************************" << std::endl;
std::cout << "[1]压栈 [2]弹栈 *" << std::endl;
std::cout << "[3]获取栈顶元素 [4]清空栈*" << std::endl;
std::cout << "[5]栈长度 *" << std::endl;
std::cout << "***************************" << std::endl;
std::cout << "请选择:>";
cin >> select;
switch (select)
{
case 1:
std::cout << "请输入要压入的值:>";
cin >> Item; getchar();
stack.Push(Item);
std::cout << " " << Item << " 已入栈" << std::endl;
break;
case 2:
stack.Pop();
break;
case 3:
stack.GetTop();
break;
case 4:
stack.clearStack();
std::cout << "栈已清空" << std::endl;
break;
case 5:
std::cout << "栈长度:" << stack.stack_sise << std::endl;
break;
default:
std::cout << "输入错误" << std::endl;
break;
}
}
return 0;
}