数据结构(三)栈和队列--栈

 

数据结构(三)栈和队列
 
栈和队列都是操作位置受限(只允许在端点处插入和删除)的线性表.
它们的不同是:
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(&
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值