前言
栈和队列是两种重要的线性结构,从数据结构角度来看,两者其实都是线性表。我们可以用集合的理念去理解三者的关系,栈和队列属于线性表,而两者又是线性表这个大集合的两个不严格独立的两个子集(特殊的双端队列可以看作栈底相邻的两个栈),两者的本质是受限的线性表。
栈的基本概念
栈——一种受限线性表,仅限定在表尾插入和删除。对于栈,表头为栈底,表尾为栈头,每一个元素进入栈都会自动沉底,所以栈遵守着先进后出的原则。同样,栈也有链式存储和顺序存储两个物理结构。
栈的应用
栈最基本的操作是——增、查、删。
入栈:先判栈满,elements[++top] = x;
出栈:先判栈空,x = elements[top—];
判栈空:top=-1;
判栈满:top = maxsize - 1;
括号匹配
//括号匹配的检验程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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
双端队列
一端允许插入和删除,一端只允许删除。