栈和队列知识点总结

栈和队列知识点总结

  • 前言
  • 栈的基本概念
    • 栈的应用
      • 括号匹配
  • 队列的基本概念
    • 队列的应用
      • 顺序队列
      • 循环队列
      • 双端队列

前言

栈和队列是两种重要的线性结构,从数据结构角度来看,两者其实都是线性表。我们可以用集合的理念去理解三者的关系,栈和队列属于线性表,而两者又是线性表这个大集合的两个不严格独立的两个子集(特殊的双端队列可以看作栈底相邻的两个栈),两者的本质是受限的线性表。

栈的基本概念

栈——一种受限线性表,仅限定在表尾插入和删除。对于栈,表头为栈底,表尾为栈头,每一个元素进入栈都会自动沉底,所以栈遵守着先进后出的原则。同样,栈也有链式存储和顺序存储两个物理结构。

栈的应用

栈最基本的操作是——增、查、删。
入栈:先判栈满,elements[++top] = x;
出栈:先判栈空,x = elements[top—];
判栈空:top=-1;
判栈满:top = maxsize - 1;

括号匹配

//括号匹配的检验程序
#include 
#include 
#include 
#define  MAXLEN 50
typedef struct stack 
{
	char ch[50];
	int top;
}ST;
//栈的初始化
ST *ST_Init()
{
	ST *st;
	if (st=(ST *)malloc(sizeof(ST)))
	{
		st->top=0;
		return st;
	}
	return NULL;
}
//出栈操作
int ST_Pop(ST *st)
{
	if (st->top==0)
	{
		printf("栈为空\n");
		return 0;
	}
	st->top--;
	return st->ch[st->top];
}
 
//入栈操作
void st_Push(ST *st,char c)
{
	if (st->top==MAXLEN)
	{
		printf("栈溢出\n");
		return ;
	}
	st->ch[st->top]=c;
	st->top++;
}
//符号检验函数
void check_symbol(ST *st,char *a)
{
	int i;
	st_Push(st,a[0]);
 
	for (i=1;i<strlen(a);i++)
	{
		//遍历每一个元素,判断出栈还是入栈
		if ((a[i]==']'&&st->ch[st->top-1]=='[')||(a[i]==')'&&st->ch[st->top-1]=='('))//出栈的条件
		{
			ST_Pop(st);
		}
		else
		{
			st_Push(st,a[i]);
		}
	}
	if(st->top==0)
	{
		printf("括号是匹配的\n\n");
	}
	else
 
	{
		printf("括号不匹配\n\n");
	}
}
 
int main()
{
 
	while (1)
	{
		char s[50];
		ST *st;
		st=ST_Init();	
		printf("请输入一串括号:\n");
		scanf("%s",s);
		if(s[0]=='E')
			return 0;
		check_symbol(st,s);
	}
 return 0;
}

队列的基本概念

队列——一种受限线性表,仅限定在表一端插入,另一端删除。队列遵守着先进先出的原则。同样,队列也有链式存储和顺序存储两个物理结构。

队列的应用

队列最基本的操作是——增、查、删。

顺序队列

入队:q[rear++] = x;
出队:x = q[front++]
判队空:front == rear;
判队满:front - rear = maxsize

循环队列

队空:front == rear
队满:(rear+1)%maxsize == front

双端队列

一端允许插入和删除,一端只允许删除。

你可能感兴趣的:(数据结构,数据结构)