堆栈

原创 2004年10月08日 11:33:00

//////////////////////////////////////////////////////////////////////////
// 设置一个顺序栈SS和一个链栈LS,实现以下操作:
// 从键盘输入若干个正整数(以输入负数为结束标志),依次压入SS中。
// 然后分别显示输入数据的逆序和正序的值(可以用LS辅助实现显示正序的值)
// **屏幕显示如下例所示:
// 3  4  6  8  9  2  -1
// 2  9  8  6  4  3
// 3  4  6  8  9  2
// 其中栈的算法实现可以参考第三章教案后面部分,
// 对顺序栈和链栈的PUSH操作要求用同样的函数名,
// (POP操作也一样)注意:C++中有函数重载的特性。
//
//////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <stdlib.h>

#define length 15

typedef struct Node *PtrToNode;
struct Node
{
 int  Element;
 PtrToNode Next;
};


PtrToNode pop(PtrToNode top, int Element);
PtrToNode push(PtrToNode top);
void  pop(int* top, int client);
int  push(int* top);

void main( void )
{
 /////////////////////////////////////////////////////
 // ss
 //
 int ss[length];
 
 int* top2;
 int* base2;
 int number;
 
 top2 = base2 = ss;
 while(1)
 {
  scanf("%d", &number);
  if((top2 - base2) < length)
   {
   pop(top2, number);
   top2++;
  }
   else
    printf("/nthe stack is full/n");
   if (number < 0)
   break;
 }
 top2 -= 2;
//////////////////////////////////////////////////////////////////////////
// sl
//
 PtrToNode top, base;
 int  Element;
 
 /*init the stack*/
 top = base = (PtrToNode)malloc(sizeof(Node));
 base->Next = NULL;
 base->Element = NULL;
 
 while(1)
 {
  if(top2 >= base2)
  {
   Element = push(top2);
   printf("%d ", Element);
   top2--;
  }
  else //the first number
   break;
  top = pop(top, Element);
 
 }

 printf("/n");
 
 while(1)
 {
  if (top != base)
  {
   printf("%d ", top->Element);
   top = push(top);
  }
  else
   break;
 }

}

//////////////////////////////////////////////////////////////////////////
// sl Function
//
PtrToNode pop(PtrToNode top, int Element)
{
 PtrToNode client;
 
 client = (PtrToNode)malloc(sizeof(Node));
 client->Next = top;
 top = client;
 top->Element = Element;
 return top;
}

PtrToNode push(PtrToNode top)
{
 PtrToNode client;

 client = top;
 top = top->Next;
 free(client);//free do the two thing free the space and set the client NULL
 return top;
}
//////////////////////////////////////////////////////////////////////////
// ss Founction
//
void pop(int *top, int client)
{
 *(top) = client;
}

int push(int *top)
{
 return *(top);
 *(top) = NULL; 
}

 

堆栈的工作原理

声明:以下均为个人见解,错漏地方还请指正 每一个使用c语言的都应该知道栈的重要性,我们能够使用C/C++语言写出诸多复杂的程序,很大功劳一部分有归于栈的实现,因为它可以帮助我们实现函数间的嵌套调用...
  • lee244868149
  • lee244868149
  • 2015年10月29日 21:52
  • 4003

满堆栈与空堆栈

     初学ARM指令时,如果从字面上理解满堆栈和空堆栈很有可能会歪曲它们的意思。可以想象一下,“满堆栈”就是一个满的堆栈,不能再存储数据了;而“空堆栈”就是一个空的堆栈,没有被使用的堆栈,呵呵,这...
  • yueyucanyang
  • yueyucanyang
  • 2009年09月02日 10:52
  • 3297

PS菜鸟入门 -- PS堆栈

一、首先看一下 PS堆栈 效果图:(取自网上)二、摄取图片首先,准备好三脚架和快门线。然后,构图。定好焦距、焦点、光圈、快门、ISO等,连续拍摄N张照片。最后,使用 PS 堆栈。这部分,再讲一个利用 ...
  • qq_29350001
  • qq_29350001
  • 2017年06月01日 17:55
  • 3410

8086的堆栈组织

堆栈段的最大长度为64KB 采用向上生长方式
  • liuyuzhu111
  • liuyuzhu111
  • 2015年11月23日 21:26
  • 717

理解堆栈及其利用方法

下午详细膜拜了一浪大牛的《无符号和栈破坏情况下coredump的分析方法》, 此刻惊魂未定,激动不已, 既然谈到了堆栈, 就跟大家分享下我认识和理解的堆栈, 希望对大家有所帮助。     ...
  • a15874647
  • a15874647
  • 2014年12月04日 15:28
  • 1617

堆栈的区别,很详细

C++中堆和栈的区别,自由存储区、全局/静态存储区和常量存储区        文章来自一个论坛里的回帖,哪个论坛记不得了!       在C++中,内存分成5个区,他们分别是堆、栈、自由存储区...
  • l1l2l3q1q2q3
  • l1l2l3q1q2q3
  • 2017年04月20日 21:39
  • 378

日志中如何输出完整的堆栈异常

程序中发生异常后,我们捕捉到异常之后一般是输出e.toString到日志,这样我们只能知道异常类型是什么,只有一个简单的描述,无法看到具体的堆栈信息。利用下面一段代码,可以将完整的堆栈信息输出到日志系...
  • cyony
  • cyony
  • 2017年06月06日 09:36
  • 793

Android下打印堆栈的两种方法

1     for(StackTraceElement i:Thread.currentThread().getStackTrace()){         System.out.printl...
  • huangyabin001
  • huangyabin001
  • 2014年05月29日 10:31
  • 3300

第二章_2.3volatle关键字

Java私有堆栈和公共堆栈的问题: 有些情况下,线程会从线程的私有堆栈中取值,而不是从公有堆栈中取值,会照成值不同步的情况 解决这个办法就是用volatle关键字标识这个值,那么它就会是从公共堆栈...
  • y41992910
  • y41992910
  • 2017年03月08日 20:23
  • 243

(第17讲)数据结构的堆栈与内存区的堆栈(总结各大神的见解)

大神1 来了解一下 C 语言的变量是如何在内存分部的。C 语言有全局变量(Global)、本地变量(Local),静态变量(Static)、寄存器变量(Regeister)。每种变量都有不同的分配方式...
  • weiyastory
  • weiyastory
  • 2016年05月27日 10:57
  • 1629
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:堆栈
举报原因:
原因补充:

(最多只允许输入30个字)