栈是特殊的线性表,只能在尾部进行插入和删除
栈的顺序储存
#include<iostream>
#include<assert.h>
using namespace std;
#define max_size 10
class stack_m {
public:
void pop_m();//弹出数组最后一个元素
void push_m(int val);//在末尾添加一个元素,值为val
bool isEmpty_m();//判断是否是空表
bool isfull_m();//判断是否是满表
void show_m();//遍历栈中所有元素
void size_m();//栈中 已有元素的个数
private:
int top=-1;//最上面的是第几个元素
int data[max_size];
};
void stack_m::push_m( int val) {
if (isfull_m()) {
cout << "栈满" << endl;
return;
}
top++;
this->data[top] = val;
}
void stack_m::pop_m() {
if (top==-1) {
cout << "已经是空表,无法再进行弹出" << endl;
return;
}
top--;
}
bool stack_m::isEmpty_m() {
if (top == -1)
return true;
else
return false;
}
bool stack_m::isfull_m() {
if (top == max_size-1)
return true;
else
return false;
}
void stack_m::show_m() {
if (this->isEmpty_m())
{
cout << "该对象里面没有任何元素!" << endl;
return;
}
for (int i = 0; i < top+1; i++)
cout << data[i] << endl;
}
void stack_m::size_m() {
cout << (top+1) << endl;
}
int main() {
stack_m my_stack;
my_stack.push_m(3);
my_stack.push_m(4);
my_stack.pop_m();
my_stack.show_m();
my_stack.size_m();
return 0;
}
栈的链式储存
切记:栈顶作为根节点,但是此根节点保存了元素val
#include<iostream>
using namespace std;
class node {
public:
friend class stack_m;
private:
int val;
node* pnext;
};
class stack_m {
public:
stack_m() {
pTop = new node;
pBottom = pTop;
pTop->pnext = NULL;
}
void pop_m();//弹出数组最后一个元素
void push_m(int val);//在栈顶添加一个元素,值为val
bool isEmpty_m();//判断是否是空表
void show_m();//显示当前所有元素的值
void clear_m();//删除所有元素
private:
node* pTop;//pTop作为头结点
node* pBottom;//栈底,不存放任何元素
};
bool stack_m::isEmpty_m() {
if (pTop == pBottom)
return true;
else
return false;
}
void stack_m::clear_m() {
node* temp = NULL;
while (pTop) {
temp = pTop;
pTop = pTop->pnext;
delete temp;
}
}
void stack_m::pop_m( ) {
if (isEmpty_m()) {
cout << "已经是空表,无法再进行弹出" << endl;
return;
}
node* temp = pTop;
cout << "被弹出来的是:" << temp->val << endl;
pTop = pTop->pnext;
delete temp;
}
void stack_m::push_m( int val) {
node* pnew = new node();
pnew->val = val;
node* temp = pTop;
pnew->pnext=pTop;
pTop = pnew;
}
void stack_m:: show_m( ) {
node* ptemp = pTop;
while (ptemp!=pBottom ) {
cout << ptemp->val;
ptemp = ptemp->pnext;
}
}
int main() {
stack_m my_stack;
my_stack.push_m(2);
my_stack.push_m(3);
my_stack.push_m(4);
my_stack.push_m(5);
my_stack.show_m();
my_stack.pop_m();
my_stack.show_m();
return 0;
}
栈的应用 ——中缀表达式 转化为 后缀表达式