目录
●图示(以顺序栈为例)
●栈的类型定义
●栈常用的基本操作
●顺序栈
●链式栈
●简单案例
1.顺序栈(这里只实现用顺序表存储3个学生的学号、姓名、年龄并且将其输出查看。若进行其他操作,对代码进行简单修改即可)
2.链式栈(不做过多演示,对代码进行简单操作即可。如:输入一个学生的信息,并查看)
●图示(以顺序栈为例)
●栈的类型定义
1.顺序栈存储结构的定义
typedef struct{
Selemtype *base; //栈底指针
Selemtype *top; // 栈顶指针
int stacksize;
}Sqstack;
实例如下:
typedef struct {
char key[10]; //学号
char name[20]; //姓名
int age; //年龄
}Selemtype;
typedef struct{
Selemtype *base;
Selemtype *top;
int stacksize;
}Sqstack;
2.链式栈存储结构的定义(对照与链式表理解记忆http://t.csdn.cn/ypvSH)
typedef struct Stacknode {
Selemtype data;
struct Stacknode* next;
}Stacknode, * Linkstack;
实例如下:
typedef struct {
char key[10];
char name[20];
int age;
}Selemtype;
typedef struct Stacknode {
Selemtype data;
struct Stacknode* next;
}Stacknode, * Linkstack;
●栈常用的基本操作
●顺序栈
1.顺序栈的初始化
int Initstack(Sqstack& S)
{
S.base = new Selemtype[maxsize];
if (!S.base)
exit(0);
S.top = S.base;
S.stacksize = maxsize;
return 1;
}
2.判断顺序栈是否为空
int Stackempty(Sqstack& S)
{
if (S.top == S.base)
return 1;
else
return 0;
}
3.求顺序栈的长度
int Stacklength(Sqstack& S)
{
return (S.top - S.base);
}
4.清空顺序栈
int Clearstack(Sqstack &S)
{
if (S.base)
S.top = S.base;
return 1;
}
5.销毁顺序栈
int Destorystack(Sqstack& S)
{
if (S.base)
{
delete S.base;
S.stacksize = 0;
S.base = S.top = NULL;
}
return 1;
}
6.顺序栈的入栈
int push(Sqstack& S, Selemtype e)
{
if (S.top - S.base == S.stacksize)
return 0;
*S.top = e;
S.top++;
return 1;
}
7.顺序栈的出栈
int pop(Sqstack& S, Selemtype e)
{
if (S.top == S.base)
return 0;
--S.top;
e = *S.top;
return 1;
}
●链式栈
1. 链栈的初始化
int Initstack(Linkstack& S)
{
S = NULL;
return 1;
}
2. 判断链栈是否为空
int Stackempty(Linkstack S)
{
if (S == NULL)
return 1;
else
return 0;
}
3. 链式栈的入栈
int Push(Linkstack& S, Selemtype e)
{
Linkstack p;
p = new Stacknode;
p->data = e;
p->next = S;
S = p;
return 1;
}
4. 链式栈的出栈
int Pop(Linkstack& S, Selemtype e)
{
if (S == NULL)
return 0;
Linkstack p;
e = S->data;
p = S;
S = S->next;
delete p;
return 1;
}
5.取栈顶元素
Selemtype Gettop(Linkstack &S)
{
if (S != NULL)
return S->data;
}
●简单案例
1.顺序栈(这里只实现用顺序表存储3个学生的学号、姓名、年龄并且将其输出查看。若进行其他操作,对代码进行简单修改即可)
#include<iostream>
#define maxsize 100
using namespace std;
//数据准备
typedef struct {
char key[10];
char name[20];
int age;
}Selemtype;
typedef struct{
Selemtype* top;
Selemtype* base;
int stacksize;
}Sqstack;
//顺序栈的初始化
int Initstack(Sqstack& S)
{
S.base = new Selemtype[maxsize];
if (!S.base)
exit(0);
S.top = S.base;
S.stacksize = maxsize;
return 1;
}
//判断顺序栈是否为空
int Stackempty(Sqstack& S)
{
if (S.top == S.base)
return 1;
else
return 0;
}
//求顺序栈的长度
int Stacklength(Sqstack& S)
{
return (S.top - S.base);
}
//清空顺序栈
int Clearstack(Sqstack &S)
{
if (S.base)
S.top = S.base;
return 1;
}
//销毁顺序栈
int Destorystack(Sqstack& S)
{
if (S.base)
{
delete S.base;
S.stacksize = 0;
S.base = S.top = NULL;
}
return 1;
}
//顺序栈的入栈
int push(Sqstack& S, Selemtype e)
{
if (S.top - S.base == S.stacksize)
return 0;
*S.top = e;
S.top++;
return 1;
}
//顺序栈的出栈
int pop(Sqstack& S, Selemtype e)
{
if (S.top == S.base)
return 0;
--S.top;
e = *S.top;
return 1;
}
//查看栈顶元素
void top(Sqstack& S)
{
if (S.top == 0)
exit(0);
S.top--;
cout << S.top->key << " " << S.top->name << " " << S.top->age << endl;
}
void showfunc()
{
cout << "1.顺序栈的初始化" << endl;
cout << "2.判断顺序栈是否为空" << endl;
cout << "3.求顺序栈的长度" << endl;
cout << "4.清空顺序栈" << endl;
cout << "5.销毁顺序栈" << endl;
cout << "6.顺序栈的入栈" << endl;
cout << "7.顺序栈的出栈" << endl;
cout << "8.查看栈顶元素" << endl;
}
void text()
{
Sqstack S;
Selemtype data;
while(1)
{
showfunc();
cout << "#要执行的操作#" << endl;
int n;
cin >> n;
switch (n)
{
case 1:
Initstack(S);
cout << "初始化完成" << endl;
break;
case 6:
cout << "请输入要输入的学生人数:" << endl;
int num; cin >> num;
for (int i = 1; i <= num; i++)
{
cin >> data.key >> data.name >> data.age;
push(S,data);
}
cout << "插入成功" << endl;
break;
case 8:
top(S);
break;
}
system("pause");
system("cls");
}
}
int main()
{
text();
}
2.链式栈(不做过多演示,对代码进行简单操作即可。如:输入一个学生的信息,并查看)
#include<iostream>
using namespace std;
typedef struct {
char key[10];
char name[20];
int age;
}Selemtype;
typedef struct Stacknode {
Selemtype data;
struct Stacknode* next;
}Stacknode, * Linkstack;
//链栈的初始化
int Initstack(Linkstack& S)
{
S = NULL;
return 1;
}
//判断链栈是否为空
int Stackempty(Linkstack S)
{
if (S == NULL)
return 1;
else
return 0;
}
//链式栈的入栈
int Push(Linkstack& S, Selemtype e)
{
Linkstack p;
p = new Stacknode;
p->data = e;
p->next = S;
S = p;
return 1;
}
//链式栈的出栈
int Pop(Linkstack& S, Selemtype e)
{
if (S == NULL)
return 0;
Linkstack p;
e = S->data;
p = S;
S = S->next;
delete p;
return 1;
}
//取栈顶元素
void Gettop(Linkstack &S)
{
if (S != NULL)
cout << S->data.key<< S->data.name << S->data.age << endl;
}
void text()
{
//不做过多演示,对代码进行简单操作即可
Linkstack S;
Selemtype Data;
Initstack(S);
cout << "初始化成功" << endl;
cout << "输入一个学生的数据:" << endl;
cin >> Data.key >> Data.name >> Data.age;
cout << "将学生信息推入链栈中" << endl;
Push(S,Data);
cout << "查看栈顶元素" << endl;
Gettop(S);
}
int main()
{
text();
}