<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; | |
} |