c语言栈的实现和表示

栈的定义:栈是仅限在表尾进行插入和删除的线性表允许进行插入和删除的一端被称为栈顶另一端被称为栈底,插入被称为进栈或入栈,删除被称为出栈或退栈。

栈的特点:先进后出

在这里插入图片描述
栈的基本算法
1.进栈
①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);
②置TOP=TOP+1(栈指针加1,指向进栈地址);
③S(TOP)=X,结束(X为新进栈的元素);
2.退栈
①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);
②X=S(TOP),(退栈后的元素赋给X):
③TOP=TOP-1,结束(栈指针减1,指向栈顶)。

栈的分类:栈分顺序栈和链式栈

顺序栈的实现
代码如下:
head.h部分

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define maxsize 30

typedef struct node
{
    int * base;
    int * top;
    int stacksize;
}Sqstack;

void InitStack(Sqstack *S);
void Push(Sqstack *S,int elem);
int  Pop(Sqstack *S);

operation.c部分:

#include"head.h"

void InitStack(Sqstack *S) //初始化栈
{
    S->base = (int *)malloc(sizeof(int)*maxsize);//给栈分配数组空间
    if(!S->base)
        exit(0);
    S->top=S->base;
    S->stacksize=maxsize;
}
void Push(Sqstack *S,int elem)//入栈
{

    *S->top++=elem;  //元素先入栈,指针后加一

}
int Pop(Sqstack *S)
{
    int elem ;
    elem=*--S->top; //栈顶指针先减一,再将栈顶元素出栈
    return elem;
}
//这里使用指针来返回函数值更为方便
/*void Pop(Sqstack *S,int*elem)
{
    *elem=*--S->top; //栈顶指针先减一,再将栈顶元素出栈
}
*/

main.c

#include"head.h"

int main()
{
    Sqstack S;
    int d,i,a,b;
    InitStack(&S);
    printf("请输入一个数:\n");
    scanf("%d",&d);
    while(!a==0)
    {
        a=d/2;
        b=d-a*2;      //取余数确定栈底元素
        d=a;
        Push(&S,b);   //元素入栈


    }
    printf("转化为二进制为:\n");
    while(S.top!=S.base)
    {
        i= Pop(&S);  /*Pop(&S,&i)*/
        printf("%d",i);
    }
    printf("\n");
}

链栈代码:
head.h

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#define ERROR -1

//定义数据结点类型
typedef struct Node{
    int data;
    struct Node*next;
} LNode,*LinkStack;

int push(LinkStack S,int element);
int pop(LinkStack S);

operation.c

#include"head.h"


int push(LinkStack S,int element){
    LNode *p;
    p= (LNode*)malloc(sizeof(LNode));
    p->data=element;
    p->next=S->next;
    S->next=p;
    return element;
}
int pop(LinkStack S){
    int e;
    LinkStack p;
    p=S->next;
    if (S==NULL) return ERROR;
    e=p->data;                      //栈顶元素赋给e
    S->next=p->next;                //栈顶指针下移
    free(p);
    return e;
}

main函数

#include"head.h"

int main()
{
    LinkStack S;
    S= (LNode*)malloc(sizeof(LNode));
    S->next = NULL;
    int i,k,a,f,h,j;
    printf( "输入入栈元素个数:\n" );
    scanf("%d",&k);
    for ( i = 0; i < k; i++)
    {
        printf("请输入元素:\n");
        scanf("%d",&a);
        push(S,a);
    }
    printf( "--------------------\n" );
    printf("输入出栈元素个数:\n" );
    scanf("%d",&f);
    printf("元素出栈\n");
    for ( h= 0; h< f; h++)
    {
        j=pop(S);
        printf("%d",j);
    }
    printf("\n");
    return 0;
}

  • 13
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值