1.在线性表中,栈是一种简单但是十分重要的数据结构,栈内元素先进后出,元素出栈,入栈,以及栈内查找等。在c++程序中,程序在编译之后被分为了五大块,其中就有栈区。栈区存储着程序中的局部变量等重要的数据,但是系统内提供的栈和我们自己实现的栈有一点区别。系统栈的内存分布是,栈顶指针一直指在高地址,元素入栈之后指针的值会减小,所以内存是从高到底排列,但是对于我们自己实现的栈是相反的。这里我没有使用栈顶指针,我使用的是整形数据来指示当前栈内的元素数量,替代了栈顶指针的作用。本次实践只是简单的模拟栈的基本操作,采用数组与链表这两种线性表分别实现栈。但是对于一些其他的操作,比如说栈内查找,以及在系统栈内,系统会提供一个EBP指针,可以遍历当前寄存器来获取当前栈内所有元素,而栈顶指针ESP始终指在栈顶位置。这一点本次实验没有模拟。以下是详细代码。
/*栈的基本实现*/
#include"stdafx.h"
#include<iostream>
#include<iomanip>
#define MaxSize 64
using namespace std;
/*基于数组实现的栈*/
class stack {
private:
int data[MaxSize];
int top = -1;//栈空的时候设置为-1;
public:
stack() {};//默认构造函数
int push(int data);//元素入栈
int pop();//元素出栈
bool isEmpty();//是否为空栈
void print_all();//遍历输出
void clear();//将栈置空
};
/*具体实现*/
bool stack::isEmpty() {
if (top < 0) {
cout << "栈是空栈" << endl;
return true;
}
return false;
}
int stack::push(int a) {
if (top > MaxSize - 1) {
cout << "the stack is full!" << endl;
return 0;
}
else {
top++;
data[top] = a;
}
return 0;
}
int stack::pop() {
if (top < 0) {
cout << "栈已经是空栈" << endl;
return 0;
}
else {
int k = data[top];
top--;
return k;
}
}
void stack::print_all() {
for (int i = 0; i < top; i++) {
cout << setw(4) << data[i];
}
}
void stack::clear() {
top = -1;
}
/*基于链表实现的栈*/
typedef struct link {
int data;//数据域
struct link*next;//指向下一节点的指针
link(int a) {
data = a;
}
}link,*linknode;
class link_stack{
private:
int top = -1;//栈顶标记;
linknode head = NULL;//链表头部指针
linknode tail = NULL;
public:
link_stack();//默认构造函数
int push(int data);//元素入栈
int pop();//元素出栈
int clear();//将栈置空;
int isEmpty();//判断是否非空
void print_all();//遍历输出栈内所有元素
};
link_stack::link_stack() {
/*构造函数里面首先做一部分工作*/
head = new link(0);
tail = head;//链表的头指针初始化为0;尾部此时等于头部
}
int link_stack::push(int data) {
linknode p = new link(data);
//此时的插入应该从头部插入
p->next = tail;//当前元素指向尾部元素
head->next = p;//头部指针指向当前元素
tail = p;//尾部元素更新为当前元素
top++;
return 0;
}
int link_stack::pop() {
linknode p = head->next;
if (p == NULL) {
cout << "栈已经是空栈" << endl;
}
//删除当前元素
head->next = p->next;//将head的指向指向p的下一个元素;
delete p;
top--;
if (top < 0) {
return 0;
}
return 0;
}
int link_stack::clear() {
//删除栈内所有的节点
linknode p = head->next;
if (p == NULL) {
cout << "当前栈为空栈" << endl;
}
else {
while (p)
{
linknode q = p;
delete q;
p = p->next;
}
}
return 0;
}
int link_stack::isEmpty() {
if (head->next == NULL) {
cout << "该栈是一个空栈" << endl;
return 1;
}
return 0;//非空栈
}
void link_stack::print_all() {
linknode p=head->next;
if (top<0) {
cout << "该栈内没有任何元素" << endl;
}
int t = top;
while (t!=-1) {
cout << setw(4) << p->data;
p = p->next;
t--;
}
}
int main() {
cout << "*********************************" << endl;
cout << "基于数组实现的栈" << endl;
stack s;
for (int i = 0; i < 10 && i < MaxSize; i++) {
s.push(i);
}
s.print_all();
s.pop();
s.print_all();
s.clear();
cout << "**************************************" << endl;
cout << "基于链表实现的栈" <<endl;
link_stack l;
l.push(1);
l.push(2);
l.push(3);
l.print_all();
cout << endl;
l.pop();
l.print_all();
l.clear();
}