QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1377|回复: 3

菜鸟图解栈(表打我哈)

[复制链接]
发表于 2004-3-18 21:30:57 | 显示全部楼层 |阅读模式
堆栈的顺序实现.(仅仅是模板)

[code:1]
/*类型定义*/

#define maxsize 6 /*顺序栈容量*/

typedef struct sqstack
   {
      int data[maxsize];
      int top;
   } SqStackTp;

/*初始化*/

int InitStack(SqStackTp *sq)
{
    sq->top = 0;
    return (1);
}

/*进栈*/

int Push(SqStackTp *sq, int x)
{
     if(sq->top == maxsize-1)
         {
             printf("栈满!\n");
             return (1);
         }
     else
         {
             sq->top++;
             sq->data[sq->top]=x;
             return (1);
          }
}

/*退栈*/

int Pop(SqStackTp *sq, int *x)
{
      if(sq->top == 0)
          {
             printf("下溢!\n");
             return (0);
          }
      else
          {
              *x= sq->data[sq->top];
               sq->top --;
               return (1);
          }
}

/*判栈空*/

int Empty(SqStackTp sq)
{
     if(sq.top == 0)
             return (1);
     else
             return (0);
}

/*取栈顶元素*/

int GetTop(SqStackTp *sq, int *x)
{
    if(sq->top == 0);
        return 0;
    else
        {
            *x=sq->data[sq->top];
            return (1);
        }
}

[/code:1]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2004-3-18 21:40:22 | 显示全部楼层
栈的链接实现

[code:1]

/*类型定义*/

typedef struct node
{
   int data;
   struct node *next;
} LStackTp;

/*初始化*/

int InitStack(LStackTp *ls)
{
    ls=NULL;
}

/*进栈*/

int Push(LStackTp *ls, int x)
{
    LStackTp *p;
    p=(LStackTp *)malloc(sizeof(LStackTp));
    p->data=x;
    p->next=ls;
    ls=p;
}

/*退栈*/

int Pop(LStackTp *ls, int *x)
{
    LStackTp *p;
    if(ls != NULL)
        {
          p=ls;
          *x=p->data;
          ls=ls->next;
          free(p);
          return (1);
        }
    else
        return (0);
}

/*判栈空*/

int EmptyStack(LStackTp *ls)
{
     if(ls=NULL)
          return (1);
     else
          return (0);
}

/*读栈顶元素*/

int GetTop(LStackTp *ls, int *x)
{
     if(ls != NULL)
        {
           *x=ls->data;
           return (1);
        }
     else
        return (0);
}

[/code:1]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复

使用道具 举报

 楼主| 发表于 2004-3-18 22:25:11 | 显示全部楼层
举例:
用顺序栈把ABCDEFGHIJKLM变为MLKJIHGFEDCBA

[code:1]

#define maxsize 40

typedef struct sqstack
{
     char data[maxsize];
     int top;
} SqStackTp;

int main()
{
    SqStackTp sq;
    int i;
    char ch;
    InitStack(&sq);
    for (ch='A'; ch<='A'+12; ch++)
      {
         Push(&sq, ch);
         printf("%c", ch);
      }
    printf("\n");
    while(! EmptyStack(sq))
        {
           Pop(&sq, &ch);
           printf("%c", ch);
        }
     printf("\n");
}

[/code:1]

用链接栈把一个带头节点的单链表倒置.

[code:1]

int reverse_list(LinkedListTp *head)
{
   LStackTp ls, p;
   int x;
   InitStack(&ls);
   p=head->next;
   while(p!=NULL)
       {
          Push(&ls, p->data);
          p=p->next;
       }
   
   p=head->next;
   while(! EmptyStack(&ls))
       {
          Pop(&ls, &x);
          p->data=x;
          p=p->next;
       }
}

[/code:1]
回复

使用道具 举报

发表于 2004-3-19 10:58:26 | 显示全部楼层
支持一下这位兄台的贡献(马屁贴? )
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 18:33 , Processed in 0.061620 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表