1.栈和队列的区别
栈是一种LIFO结构,即后进先出,它是一种线性表,而我们知道线性表是由数组组成的
栈(stack)是限定仅在表尾进行插入和删除操作的线性表。
2.创建一个普通栈
这种结构的定义、初试化、入栈操作、出栈操作可以由以下代码表示:
// 4.1stack.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#define MAXSIZE 20
#define TRUE true
#define ERROR false
#define YES true
#define NO false
typedef bool Status;
typedef int SElemType;
typedef struct //结构体定义
{
SElemType data[MAXSIZE];
int top;
}SqStack;
Status Push(SqStack *S, SElemType e);
Status Pop(SqStack *S, SElemType *e);
int main()
{
using namespace std;
SElemType SE;
SElemType *Address = &SE;
SqStack S1 = { {0},-1 };
bool judge = 0;
cout << "入栈操作:";
cout << S1.data[0]<<endl; //未入栈之前的数组元素全为0
judge = Push(&S1, 1); //将数值1入栈
cout <<judge<<endl<< S1.data[0]; //此时入栈操作成功并且数组第一个元素变为1
cout << "出栈操作:";
judge = Pop(&S1, Address); //将出栈的元素存入Address中
cout << judge<<endl<<S1.top; //此时输出结果top为-1表示此时为一个空栈
}
Status Push(SqStack *S, SElemType e) //入栈操作
{
if ((S->top) == MAXSIZE - 1)
return ERROR;
S->top++;
S->data[S->top] = e;
return TRUE;
}
Status Pop(SqStack *S, SElemType *e) //出栈操作
{
if ((S->top) == -1)
return ERROR;
*e = S->data[S->top];
S->top--;
return TRUE;
}
3.创建一个共享数组栈
我们可以创建两个栈共享一个数组,这样做的原因一定程度上是为了数据内存的聚集性。
代码如下:
typedef struct
{
SElemType data[MAXSIZE];
int top1;
int top2;
}SqDoubleStack;//定义一个共享栈 其中包含两个指针
/*插入元素为新的栈顶元素*/
Status Push(SqDoubleStack *S, SElemType e, int stacknumber)
{
if (S->top1 + 1 == S->top2)
return ERROR; //说明栈满
if (stacknumber == 1)//栈1元素入栈
S->data[++S->top1] = e;
else if(stacknumber == 2)//栈2元素入栈
S->data[--S->top2] = e;
return TRUE;
}
/*删除元素*/
Status Pop(SqDoubleStack *S, SElemType *e, int stacknumber)
{
if ((S->top1 == -1) || S->top2 == n) //到栈底无法删除
return FALSE;
if (stacknumber == 1)//删除栈1的元素
*e = S->data[S->top1--]; //将删除的元素保存到预存地址中
else if (stacknumber == 2) //删除栈2的元素
*e = S->data[S->top2++];
return TRUE;
}
4.创建一个链式栈
相对于顺序存储结构,链式结构每个元素并不是按顺序存储在连续的地址中,因此对于链式栈来说,基本不存在栈满的情况,除非计算机内存已满。
链式栈的结构代码如下:
typedef struct StackNode
{
SElemType data;
struct StackNode *next; //是不是想到递归叻 嗯哼
}StackNode,*LinkStackPtr;
typedef struct
{
LinkStackPtr top;
int count;
}LinkStack;
进栈操作
Status Push(LinkStack *S,SElemType e)
{
LinkStackPtr s = new StackNode; //分配动态内存
s->data = e;
s->next=S->top; //这两列代码不能交换
S->top = s; //这两列代码不能交换
S->count++;
return TURE;
}
出栈操作
Status Pop(LinkStack *S,SElemType *e)
{
LinkStackPtr p;
if(StackEmpty(*S))
return ERROR;
*e = S->top->data; //将要删除的元素保存在预存空间
p = 0S->top;
S->top = S->top->next;
delete e; //释放空间
S->count--;
return TURE;
}