<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
c++ 语言,链栈实现
实验内容:
- 编程实现栈的如下功能:
 
(1)建立一个长度为 n 的顺序栈,元素类型可自行定义,并输出栈中各元素值。
(2)将数据元素 e 入栈,并输出入栈后的顺序栈中各元素值。
(3)将顺序栈中的栈顶元素出栈,并输出出栈元素的值和出栈后顺序栈中各元素值。- 编程实现队列的如下功能:
 
(1)建立一个长度为 n 的循环队列,元素类型可自行定义,并输出队列中各元素值。
(2)将数据元素 e 入队,并输出入队后的队列中各元素值。
(3)将循环队列的队首元素出队,并输出出队元素的值和出队后队列中各元素值。- 编程实现链式栈的如下功能
 
建立长度为 n 的链式栈,元素类型可自行定义,实现栈的初始化、进栈、出栈等典型操作。
整体上,一是实现顺序栈和链栈的基本操作:入栈操作(Push)、出栈操作(Pop)、取栈顶元素(Top)、判断栈空(IsEmpty)、判断栈满(IsFull)、获取栈中元素个数(Size)、展示栈中所有元素(PrintStack)、清空栈中所有元素(Clear)。二是实现队列的基本操作:入队操作(Push)、出队操作(Pop)、取队首元素(Front)、判断队空(IsEmpty)、判断队满(IsFull)、获取队中元素个数(Size)、展示队中所有元素(PrintQueue)、清空队中所有元素(Clear)。依旧是封装一个模板类。初始化和销毁操作在构造函数和析取函数中实现。
# 顺序栈
# 顺序栈操作类定义
// 顺序栈定义 | |
template <class T> class myStack1 {  | |
private:  | |
int MaxSize; // 堆栈容量  | |
T* Data; // 数据  | |
int top; // 记录栈顶元素 为栈顶元素下标后一个下标,为空时 top 为 0  | |
public:  | |
myStack1(int maxsize = 100); // 构造函数 分配空间  | |
~myStack1(); // 析构函数 回收空间  | |
void PrintStack(); // 展示顺序栈中所有元素  | |
void Push(T data); // 入栈操作,top 值加一,存储元素 item 在栈顶  | |
T Pop(); // 出栈操作,将元素弹出返回,Top 值减一  | |
T Top(); // 取栈顶元素,不弹出  | |
int Size(); // 获取堆栈元素数量  | |
bool IsEmpty(); // 判断栈空与否  | |
bool IsFull(); // 判断栈满与否  | |
};  | 
# 主要操作
# (1) 构造函数和析构函数
template <class T>  | |
myStack1<T>::myStack1(int maxsize) : MaxSize(maxsize), top(0) {  | |
Data = new T[maxsize];  | |
};  | |
template <class T> myStack1<T>::~myStack1() {  | |
if (Data)  | |
delete[] Data;  | |
} | 
# (2) 判断栈空栈满
// 判断栈空与否 | |
template <class T> bool myStack1<T>::IsEmpty() {  | |
return top == 0;  | |
} | |
// 判断栈满与否 | |
template <class T> bool myStack1<T>::IsFull() {  | |
return top == MaxSize;  | |
} | 
# (3) 入栈操作
存储元素 data 在栈顶,Top 值加一
template <class T> void myStack1<T>::Push(T data) {  | |
if (IsFull()) {  | |
cout << "error:Failed to Push,The Stack is Full!" << endl;  | |
} else {  | |
Data[top++] = data;  | |
 } | |
} | 
# (4) 取栈顶元素
取栈顶元素,不弹出
template <class T> T myStack1<T>::Top() {  | |
if (IsEmpty()) {  | |
cout << "error:The Top isn't existed, The Stack is Empty!" << endl;  | |
return error; // ERROR 为 T 类型中的特殊值  | |
} else {  | |
return Data[top - 1];  | |
 } | |
} | 
# (5) 获取堆栈元素数量
template <class T> int myStack1<T>::Size() {  | |
return top;  | |
} | 
# (6) 出栈操作
弹出栈顶元素,Top 值减一
template <class T> T myStack1<T>::Pop() {  | |
if (IsEmpty()) {  | |
cout << "error:Failed to Pop, The Stack is Empty!" << endl;  | |
return error; // ERROR 为 T 类型中的特殊值  | |
} else {  | |
T temp = Data[--top];  | |
return temp;  | |
 } | |
} | 
# (7) 展示顺序栈中所有元素
template <class T> void myStack1<T>::PrintStack() {  | |
if (IsEmpty())  | |
cout << "This Stack is empty!" << endl;  | |
for (int i = 0; i < top; ++i) {  | |
cout << "The " << i + 1 << "th Data is:";  | |
cout << Data[i] << endl;  | |
 } | |
cout << "The Stack has " << top << " elements in total." << endl;  | |
} | 
# 完整代码
// 顺序栈 | |
#include <bits/stdc++.h> | |
#define error -1 | |
using namespace std;  | |
// 顺序栈定义 | |
template <class T> class myStack1 {  | |
private:  | |
int MaxSize; // 堆栈容量  | |
T* Data; // 数据  | |
int top; // 记录栈顶元素 为栈顶元素下标后一个下标,为空时 top 为 0  | |
public:  | |
myStack1(int maxsize = 100); // 构造函数 分配空间  | |
~myStack1(); // 析构函数 回收空间  | |
void PrintStack(); // 展示顺序栈中所有元素  | |
void Push(T data); // 入栈操作,top 值加一,存储元素 item 在栈顶  | |
T Pop(); // 出栈操作,将元素弹出返回,Top 值减一  | |
T Top(); // 取栈顶元素,不弹出  | |
int Size(); // 获取堆栈元素数量  | |
bool IsEmpty(); // 判断栈空与否  | |
bool IsFull(); // 判断栈满与否  | |
};  | |
// 顺序栈操作类实现 | |
// 构造函数 分配空间 | |
template <class T>  | |
myStack1<T>::myStack1(int maxsize) : MaxSize(maxsize), top(0) {  | |
Data = new T[maxsize];  | |
};  | |
// 析构函数 释放空间 | |
template <class T> myStack1<T>::~myStack1() {  | |
if (Data)  | |
delete[] Data;  | |
} | |
//(1) 判断栈空与否 | |
template <class T> bool myStack1<T>::IsEmpty() {  | |
return top == 0;  | |
} | |
//(2) 判断栈满与否 | |
template <class T> bool myStack1<T>::IsFull() {  | |
return top == MaxSize;  | |
} | |
//(3) 入栈操作 | |
// 存储元素 data 在栈顶,Top 值加一 | |
template <class T> void myStack1<T>::Push(T data) {  | |
if (IsFull()) {  | |
cout << "error:Failed to Push,The Stack is Full!" << endl;  | |
 } | |
else {  | |
Data[top++] = data;  | |
 } | |
} | |
//(4) 取栈顶元素,不弹出 | |
template <class T> T myStack1<T>::Top() {  | |
if (IsEmpty()) {  | |
cout << "error:The Top isn't existed, The Stack is Empty!" << endl;  | |
return error; // ERROR 为 T 类型中的特殊值  | |
 } | |
else {  | |
return Data[top - 1];  | |
 } | |
} | |
//(5) 获取堆栈元素数量 | |
template <class T> int myStack1<T>::Size() {  | |
return top;  | |
} | |
//(6) 出栈操作 | |
// 弹出栈顶元素,Top 值减一 | |
template <class T> T myStack1<T>::Pop() {  | |
if (IsEmpty()) {  | |
cout << "error:Failed to Pop, The Stack is Empty!" << endl;  | |
return error; // ERROR 为 T 类型中的特殊值  | |
 } | |
else {  | |
T temp = Data[--top];  | |
return temp;  | |
 } | |
} | |
//(7) 展示顺序栈中所有元素 | |
template <class T> void myStack1<T>::PrintStack() {  | |
if (IsEmpty())  | |
cout << "This Stack is empty!" << endl;  | |
for (int i = 0; i < top; ++i) {  | |
cout << "The " << i + 1 << "th Data is:";  | |
cout << Data[i] << endl;  | |
 } | |
cout << "The Stack has " << top << " elements in total." << endl;  | |
} | |
// 主函数中调用的函数 (测试用) | |
template <class T> void Stack_Push(myStack1<T>& S) {  | |
 T data; | |
cout << "请输入要入栈的元素:";  | |
cin >> data;  | |
S.Push(data);  | |
cout << "------------- After Push, Stack S ---------------" << endl;  | |
S.PrintStack();  | |
} | |
template <class T> void Stack_Pop(myStack1<T>& S) {  | |
T data = S.Pop();  | |
if (data != error) {  | |
cout << "出栈元素为:";  | |
cout << data << endl;  | |
 } | |
cout << "------------- After Pop, Stack S ---------------" << endl;  | |
S.PrintStack();  | |
} | |
template <class T> void Stack_Top(myStack1<T>& S) {  | |
T data = S.Top();  | |
if (data != error) {  | |
cout << "栈顶元素为:";  | |
cout << data << endl;  | |
 } | |
} | |
template <class T> void Stack_Size(myStack1<T>& S) {  | |
cout << "该堆栈中元素个数为:" << S.Size() << endl;  | |
} | |
template <class T> void Stack_PrintStack(myStack1<T>& S) {  | |
cout << "---------------------- Stack S --------------------" << endl;  | |
S.PrintStack();  | |
} | |
int main() {  | |
int n;  | |
cout << "输入n,建立长度为n的顺序栈:";  | |
cin >> n;  | |
myStack1<int> S(n);  | |
cout << "输入n个元素:" << endl;  | |
for (int i = 0; i < n; ++i) {  | |
int data;  | |
cin >> data;  | |
S.Push(data);  | |
 } | |
cout << "1 入栈操作" << endl;  | |
cout << "2 出栈操作" << endl;  | |
cout << "3 取栈顶元素" << endl;  | |
cout << "4 取堆栈元素个数" << endl;  | |
cout << "5 输出顺序栈中所有元素" << endl;  | |
cout << "6 结束" << endl;  | |
while (1) {  | |
int choice;  | |
cout << "菜单选择:";  | |
cin >> choice;  | |
getchar();  | |
switch (choice) {  | |
case 1: Stack_Push(S); break;  | |
case 2: Stack_Pop(S); break;  | |
case 3: Stack_Top(S); break;  | |
case 4: Stack_Size(S); break;  | |
case 5: Stack_PrintStack(S); break;  | |
case 6: break;  | |
default: cout << "输入错误,请重新输入";  | |
  } | |
if (choice == 6)  | |
exit(0);  | |
cout << "按回车键继续…" << endl;  | |
getchar();  | |
};  | |
return 0;  | |
} | 
# 链栈
# 链栈结点定义
template <class T> class SNode {  | |
private:  | |
SNode* next; // 指针  | |
T Data; // 数据  | |
public:  | |
friend class Stack<T>;  | |
SNode() { next = nullptr; } // 空结点  | |
SNode(T data) { // 有数据的结点  | |
Data = data;  | |
next = nullptr;  | |
 } | |
void showdata() { cout << Data << endl; } // 展示该结点数据  | |
};  | 
# 链栈操作类定义
template <class T> class Stack {  | |
private:  | |
int maxsize; // 堆栈容量  | |
SNode<T>* head; // 头指针 带空头结点,所以栈顶元素一直为 head->next  | |
public:  | |
Stack(int size = 100); // 构造函数 分配空间,空头结点  | |
~Stack(); // 析构函数 回收空间  | |
void PrintStack(); // 展示栈中所有元素  | |
void Clear(); // 清空栈中所有元素  | |
void Push(T data); // 入栈操作 存储元素 data 在栈顶  | |
T Pop(); // 出栈操作 弹出栈顶元素并将其在栈中删除  | |
T Top(); // 取栈顶元素,不弹出  | |
int Size(); // 获取堆栈元素数量  | |
bool IsEmpty(); // 判断栈空与否  | |
bool IsFull(); // 判断栈满与否  | |
};  | 
# 主要操作
# (1) 构造函数和析构函数
// 构造函数 分配空间,空头结点 | |
template <class T> Stack<T>::Stack(int size) : maxsize(size) {  | |
head = new SNode<T>;  | |
head->next = nullptr;  | |
};  | |
// 析构函数 释放空间 | |
template <class T> Stack<T>::~Stack() {  | |
while (head->next) {  | |
Pop();  | |
 } | |
if (head)  | |
delete head;  | |
} | 
# (2) 判断栈空栈满
template <class T> bool Stack<T>::IsEmpty() {  | |
if (head->next) return false;  | |
else return true;  | |
} | |
template <class T> bool Stack<T>::IsFull() {  | |
if (Size() < maxsize) return false;  | |
else return true;  | |
} | 
# (3) 入栈操作
存储元素 data 在栈顶
template <class T> void Stack<T>::Push(T data) {  | |
if (IsFull()) {  | |
cout << "error:Failed to Push,The Stack is Full!" << endl;  | |
} else {  | |
SNode<T>* p = new SNode<T>;  | |
p->Data = data;  | |
p->next = head->next;  | |
head->next = p;  | |
 } | |
} | 
# (4) 取栈顶元素
template <class T> T Stack<T>::Top() {  | |
if (IsEmpty()) {  | |
cout << "error:The Top isn't existed, The Stack is Empty!" << endl;  | |
return error;  | |
} else {  | |
T temp = head->next->Data;  | |
return temp;  | |
 } | |
} | 
# (5) 获取堆栈元素数量
template <class T> int Stack<T>::Size() {  | |
int cnt = 0;  | |
SNode<T>* p = head;  | |
while (p->next) {  | |
cnt++;  | |
p = p->next;  | |
 } | |
return cnt;  | |
} | 
# (6) 出栈操作
弹出栈顶元素并将其在栈中删除
template <class T> T Stack<T>::Pop() {  | |
if (IsEmpty()) {  | |
cout << "error:Failed to Pop, The Stack is Empty!" << endl;  | |
return error;  | |
} else {  | |
SNode<T>* temp = head->next;  | |
T TopData = temp->Data;  | |
head->next = temp->next;  | |
delete temp;  | |
return TopData;  | |
 } | |
} | 
# (7) 展示栈中所有元素
弹出栈顶元素并将其在栈中删除
template <class T> T Stack<T>::Pop() {  | |
if (IsEmpty()) {  | |
cout << "error:Failed to Pop, The Stack is Empty!" << endl;  | |
return error;  | |
} else {  | |
SNode<T>* temp = head->next;  | |
T TopData = temp->Data;  | |
head->next = temp->next;  | |
delete temp;  | |
return TopData;  | |
 } | |
} | 
# (8) 清空栈中所有元素
//(8) 清空栈中所有元素 | |
template <class T> void Stack<T>::Clear() {  | |
while (head->next) {  | |
Pop();  | |
 } | |
} | 
# 完整代码
// 链栈 | |
#include <bits/stdc++.h> | |
#define error -1 | |
using namespace std;  | |
template <class T> class Stack;  | |
// 链栈结点定义 | |
template <class T> class SNode {  | |
private:  | |
SNode* next; // 指针  | |
T Data; // 数据  | |
public:  | |
friend class Stack<T>;  | |
SNode() { next = nullptr; } // 空结点  | |
SNode(T data) { // 有数据的结点  | |
Data = data;  | |
next = nullptr;  | |
 } | |
void showdata() { cout << Data << endl; } // 展示该结点数据  | |
};  | |
// 链栈操作类定义 | |
template <class T> class Stack {  | |
private:  | |
int maxsize; // 堆栈容量  | |
SNode<T>* head; // 头指针 带空头结点,所以栈顶元素一直为 head->next  | |
public:  | |
Stack(int size = 100); // 构造函数 分配空间,空头结点  | |
~Stack(); // 析构函数 回收空间  | |
void PrintStack(); // 展示栈中所有元素  | |
void Clear(); // 清空栈中所有元素  | |
void Push(T data); // 入栈操作 存储元素 data 在栈顶  | |
T Pop(); // 出栈操作 弹出栈顶元素并将其在栈中删除  | |
T Top(); // 取栈顶元素,不弹出  | |
int Size(); // 获取堆栈元素数量  | |
bool IsEmpty(); // 判断栈空与否  | |
bool IsFull(); // 判断栈满与否  | |
};  | |
// 链栈操作类实现 | |
// 构造函数 分配空间,空头结点 | |
template <class T> Stack<T>::Stack(int size) : maxsize(size) {  | |
head = new SNode<T>;  | |
head->next = nullptr;  | |
};  | |
// 析构函数 释放空间 | |
template <class T> Stack<T>::~Stack() {  | |
while (head->next) {  | |
Pop();  | |
 } | |
if (head)  | |
delete head;  | |
} | |
//(1) 判断栈空与否 | |
template <class T> bool Stack<T>::IsEmpty() {  | |
if (head->next)  | |
return false;  | |
 else | |
return true;  | |
} | |
//(2) 判断栈满与否 | |
template <class T> bool Stack<T>::IsFull() {  | |
if (Size() < maxsize)  | |
return false;  | |
 else | |
return true;  | |
} | |
//(3) 入栈操作 | |
// 存储元素 data 在栈顶 | |
template <class T> void Stack<T>::Push(T data) {  | |
if (IsFull()) {  | |
cout << "error:Failed to Push,The Stack is Full!" << endl;  | |
 } | |
else {  | |
SNode<T>* p = new SNode<T>;  | |
p->Data = data;  | |
p->next = head->next;  | |
head->next = p;  | |
 } | |
} | |
//(4) 取栈顶元素,不弹出 | |
template <class T> T Stack<T>::Top() {  | |
if (IsEmpty()) {  | |
cout << "error:The Top isn't existed, The Stack is Empty!" << endl;  | |
return error;  | |
 } | |
else {  | |
T temp = head->next->Data;  | |
return temp;  | |
 } | |
} | |
//(5) 获取堆栈元素数量 | |
template <class T> int Stack<T>::Size() {  | |
int cnt = 0;  | |
SNode<T>* p = head;  | |
while (p->next) {  | |
cnt++;  | |
p = p->next;  | |
 } | |
return cnt;  | |
} | |
//(6) 出栈操作 | |
// 弹出栈顶元素并将其在栈中删除 | |
template <class T> T Stack<T>::Pop() {  | |
if (IsEmpty()) {  | |
cout << "error:Failed to Pop, The Stack is Empty!" << endl;  | |
return error;  | |
 } | |
else {  | |
SNode<T>* temp = head->next;  | |
T TopData = temp->Data;  | |
head->next = temp->next;  | |
delete temp;  | |
return TopData;  | |
 } | |
} | |
//(7) 展示栈中所有元素 | |
template <class T> void Stack<T>::PrintStack() {  | |
if (IsEmpty())  | |
cout << "This Stack is empty!" << endl;  | |
SNode<T>* p = head;  | |
int cnt = 0;  | |
while (p->next) {  | |
++cnt;  | |
p = p->next;  | |
cout << "The " << cnt << "th Data is:";  | |
cout << p->Data << endl;  | |
 } | |
cout << "The Stack has " << Size() << " elements in total." << endl;  | |
} | |
//(8) 清空栈中所有元素 | |
template <class T> void Stack<T>::Clear() {  | |
while (head->next) {  | |
Pop();  | |
 } | |
} | |
// 主函数中调用的函数 (测试用) | |
template <class T> void Stack_Push(Stack<T>& S) {  | |
 T data; | |
cout << "请输入要入栈的元素:";  | |
cin >> data;  | |
getchar();  | |
S.Push(data);  | |
cout << "------------- After Push, Stack S ---------------" << endl;  | |
S.PrintStack();  | |
} | |
template <class T> void Stack_Pop(Stack<T>& S) {  | |
T data = S.Pop();  | |
if (data != error) {  | |
cout << "出栈元素为:";  | |
cout << data << endl;  | |
 } | |
cout << "------------- After Pop, Stack S ---------------" << endl;  | |
S.PrintStack();  | |
} | |
template <class T> void Stack_Top(Stack<T>& S) {  | |
T data = S.Top();  | |
if (data != error) {  | |
cout << "栈顶元素为:";  | |
cout << data << endl;  | |
 } | |
} | |
template <class T> void Stack_Size(Stack<T>& S) {  | |
cout << "该堆栈中元素个数为:" << S.Size() << endl;  | |
} | |
template <class T> void Stack_PrintStack(Stack<T>& S) {  | |
cout << "---------------------- Stack S --------------------" << endl;  | |
S.PrintStack();  | |
} | |
template <class T> void Stack_ClearStack(Stack<T>& S) {  | |
S.Clear();  | |
cout << "成功清空!" << endl;  | |
} | |
int main() {  | |
int n;  | |
cout << "输入n,建立长度为n的链栈:";  | |
cin >> n;  | |
Stack<int> S(n);  | |
cout << "输入n个元素:" << endl;  | |
for (int i = 0; i < n; ++i) {  | |
int data;  | |
cin >> data;  | |
S.Push(data);  | |
 } | |
cout << "1 入栈操作" << endl;  | |
cout << "2 出栈操作" << endl;  | |
cout << "3 取栈顶元素" << endl;  | |
cout << "4 取堆栈元素个数" << endl;  | |
cout << "5 输出栈中所有元素" << endl;  | |
cout << "6 清空栈中所有元素" << endl;  | |
cout << "7 结束" << endl;  | |
while (1) {  | |
int choice;  | |
cout << "菜单选择:";  | |
cin >> choice;  | |
getchar();  | |
switch (choice) {  | |
case 1: Stack_Push(S); break;  | |
case 2: Stack_Pop(S); break;  | |
case 3: Stack_Top(S); break;  | |
case 4: Stack_Size(S); break;  | |
case 5: Stack_PrintStack(S); break;  | |
case 6: Stack_ClearStack(S); break;  | |
case 7: break;  | |
default: cout << "输入错误,请重新输入";  | |
  } | |
if (choice == 7)  | |
exit(0);  | |
cout << "按回车键继续…" << endl;  | |
getchar();  | |
};  | |
return 0;  | |
} |