数据结构(三)栈和队列
栈和队列都是操作位置受限(只允许在端点处插入和删除)的线性表.
它们的不同是:
1.
栈是先进后出的线性表,而队列是先进先出的线性表,也就是说栈是按先进后出的原则进行修改,队列是按先进先出的原则进行修改;
2.
栈只在表的一端(栈顶)进行插入和删除,队列是分别在表的两端进行插入(队尾)和删除(队头)。
下面分别说说栈和队列:
栈:
栈的基本运算有六种:
1) IitiStack(S)
构造一个空栈S
2) StackEmpty(S)
判断栈是否为空
3) StackFull(S)
判断栈是否满
4) Push(S)
入栈
5) Pop(S)
出栈
6) StackTop(S)
取栈顶元素
栈分为顺序栈和链栈:
1)顺序栈:
// SeqStack.c
#include<stdio.h>
#include<stdlib.h>
//错误处理函数
/*stderr与stdin,stdout一样是流.具体说stdin是标准输入流,默认为键盘,
stdout是标准输出流,默认为屏幕,
stderr是标准错误流,一般把屏幕设为默认,也可以输出到文件,如:
FILE *new;
new=(fopen("stderr.log","w",stderr); //用fopen把sterr重定向
...
fprintf(stderr,"stderr info...");
...
fclose(new);
*/
void Error(char *msg)
{
fprintf(stderr,"Error:%s/n",msg);
exit(1);//终止程序
}
//定义顺序栈
#define StackSize 100
typedef int DataType;
typedef struct tagSeqStack
{
DataType data[StackSize];
int top;
}SeqStack;
//构造空栈S
void InitStack(SeqStack *S)
{
S->top=-1;
}
//判断栈是否为空
int StackEmpty(SeqStack *S)
{
return S->top==-1;
}
//判断栈是否满
int StackFull(SeqStack *S)
{
return S->top==StackSize-1;
}
//入栈
void Push(SeqStack *S, DataType e)
{
if(StackFull(S))
{
Error("栈满");
}
S->data[++S->top]=e;//先将栈顶指针加1再将元素e入栈
}
//出栈
DataType Pop(SeqStack *S)
{
if(StackEmpty(S))
Error("栈空");
return S->data[S->top--];//先出栈顶元素再将栈顶指针减1
}
//取栈顶元素
DataType StackTop(SeqStack *S)
{
if(StackEmpty(S))
Error("栈空");
return S->data[S->top];
}
//输出栈中所有元素
void PrintStackE(SeqStack *S)
{
int tmpTop=S->top;
while(tmpTop>-1)
{
printf(" %d",S->data[tmpTop--]);
}
printf(" /n");
}
void main()
{
int i;
SeqStack StackTest;
InitStack(&StackTest);
for(i=0;i<10;++i)
{
Push(&StackTest,i);
}
PrintStackE(&