三 栈

1.定义

  • 重要术语

    • 栈顶:允许 插入和删除的一端。
    • 栈底:不允许 插入删除的一端。
    • 空栈:不含任何元素的空表。
  • 出栈顺序(卡特兰数):

2.基本操作

#include<stdio.h>

#define MaxSize 10
#define ElemType int

//定义
typedef struct {
	ElemType data[MaxSize];//静态数组存放栈中元素
	int top;//栈顶指针
}SqStack;

//初始化
void InitStack(SqStack& S)
{
	S.top = -1;//初始化栈顶指针
}

//判断栈空
bool StackEmpty(SqStack S)
{
	if (S.top == -1)
		return true;
	else
		return false;
}

//新元素入栈
bool Push(SqStack& S, ElemType x)
{
	//栈满报错
	if (S.top == MaxSize - 1)
	{
		return false;
	}

	S.data[++S.top] = x;//新元素入栈
	return true;
}

//出栈操作
bool Pop(SqStack& S, ElemType& x)
{
	//栈空,报错
	if (S.top == -1)return false;

	x = S.data[S.top--];//出栈
	return true;
}

//读栈顶元素
bool GetTop(SqStack S, ElemType& x)
{
	if (S.top == -1)return false;
	//记录栈顶元素
	x = S.data[S.top];
	return true;
}

int main()
{
	SqStack S;
	InitStack(S);

	for (int i = 0; i < 10; i++)
	{
		printf("入栈元素:%d  ", i);
		Push(S, i);
	}
	printf("入栈结束!\n\n");

	int x;
	for (int i = 0; i < 5; i++)
	{
		Pop(S, x);
		printf("出栈元素:%d  ", x);
	}
	printf("出栈结束!\n\n");

	if (!StackEmpty(S))
	{
		GetTop(S, x);
		printf("栈顶元素:%d\n", x);
	}
	return 0;
}

3.共享栈

  • 定义

    typedef struct{
        ElemType data[MaxSize];//静态数组存放栈中元素
        int top0;//0号栈栈顶指针
        int top1;//1号栈栈顶指针
    }
    
    //初始化
    void InitStack(ShStack &S){
        S.top0=-1;//初始化栈顶指针
        S.top1=MaxSize;
    }
    
  • 栈满条件

    top0+1==top1;

4.链栈

  • 定义

  • 优点

  • 实现

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ElemType int

typedef struct Linknode {
	ElemType data;//数据域
	struct Linknode* next;//指针域
}LSnode,*LiStack;//栈类型定义

//初始化
//不带头结点
bool InitList(LiStack& S)
{
	S = NULL;
	return true;
}

//判空
bool isEmpty(LiStack &S)
{
	if (S == NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}

//随机创建栈
bool Stack_Creat(LiStack& S)
{
	LSnode* t;
	int n = 10;
	srand(time(0));
	while (n--)
	{
		t = (LSnode*)malloc(sizeof(LSnode));
		t->data = rand() % 100 + 1;
		if (isEmpty(S))
		{
			t->next = NULL;
			S = t;//t作为头结点
		}
		else
		{
			t->next = S;
			S = t;
		}
	}
	return true;
}

//入栈
//插入数据为新栈顶元素
bool Stack_Push(LiStack& S, ElemType x)
{
	LSnode* t;
	t = (LSnode*)malloc(sizeof(LSnode));
	t->data = x;
	t->next = S;
	S = t;
	return true;
}

//出栈
bool Stack_Pop(LiStack& S, ElemType& x)
{
	x = S->data;
	S = S->next;
	return true;
}

//读栈顶元素
bool Stack_Top(LiStack& S, ElemType& x)
{
	x = S->data;
	return true;
}

void Stack_Print(LiStack& S)
{
	LiStack t = S;
	while (t->next != NULL)
	{
		printf("%d,", t->data);
		t = t->next;
	}
	printf("%d\n", t->data);
}

int main()
{
	LiStack S;
	InitList(S);

	printf("创建栈:\n");
	Stack_Creat(S);
	Stack_Print(S);
	printf("\n");

	int x;
	printf("请输入要添加的元素:");
	scanf_s("%d", &x);
	Stack_Push(S, x);
	Stack_Print(S);
	printf("\n");

	int y;
	Stack_Pop(S, y);
	printf("出栈元素:%d\n", y); 
	Stack_Print(S);
	printf("\n");

	int z;
	Stack_Top(S, z);
	printf("栈顶元素:%d\n", z);
}
06-30 10:02