利用堆栈指针PUSH和POP编写一个C语言程序

利用堆栈指针PUSH和POP编写一个C语言程序,要求20个整数区间的数列,一个函数把这20个数放进去,一个函数把这20个数释放出来。

第1个回答  推荐于2018-04-21
#include <stdio.h>
#include <stdlib.h>

struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;

struct Node
{
int x;
PtrToNode Next;
};
int IsEmpty( Stack s )
{
return s->Next == NULL;
}
void Push( int x, Stack s )//压栈
{
PtrToNode TmpCell;

TmpCell = malloc( sizeof( struct Node ) );
if( TmpCell == NULL)
{
printf("Out of Space!!");
exit(0);
}
else
{
TmpCell->x = x;
TmpCell->Next = s->Next;
s->Next = TmpCell;
printf("%d has been pushed!\n",x);
}
}
int Top( Stack s )//返回栈顶元素
{
if( !IsEmpty( s ))
{
return s->x;
}
printf("The stack is Empty!");
return -1;
}
void Pop( Stack s )//出栈
{
PtrToNode FirstCell;
if( IsEmpty( s ) )
{
printf("The stack is Empty!");
return;
}
else
{
FirstCell = s->Next;
s->Next = s->Next->Next;
printf("%d has been poped!\n",FirstCell->x);
free(FirstCell);

}
}
void MakeEmpty( Stack s )//清空栈
{
if( s == NULL )
{
printf( "Must use CreateStack first" );
return;
}
else
{
while( !IsEmpty( s ) )
{
Pop(s);
}
}

}
Stack CreateStack()//创建新栈
{
Stack s = malloc( sizeof( struct Node ) );
if( s == NULL )
{
printf( "Out of space!" );
exit(0);
}
s->Next = NULL;
MakeEmpty( s );
return s;
}

void main()
{
int i;
Stack s;
s = CreateStack();
for(i=1;i<=20;++i)//将1~20压入栈
{
Push(i,s);
}
for(i=1;i<=20;++i)
{
Pop(s);
}

}
希望能帮到你,回答有点晚,希望来得及~本回答被网友采纳
第2个回答  2010-12-06
这个自己写,有问题再出来问.

想用c语言写个关于逆波兰表达式的小程序 堆栈的弹出函数有问题 求助...
void push(char ch,char *s);char pop(*s);这两个函数的参数要改成指针的指针。不然你只是改了形参的值。那个全局的s没变化。懂了没?

堆栈中PUSH与POP
每执行一次字数据的入栈,sp的内容减2。相反,每执行一次字数据的出栈,sp的内容加2。所以压入3个字后,sp=sp-6=1140h-0006h=113ah

写一个算法,将一个顺序栈中的元素依次取出,并打印元素
int elem [Stack_Size];int top ;\/*存放栈顶元素的下标*\/ } SeqStack;void Pop (SeqStack *S,int x){ if(S->top==-1) \/*栈为空*\/ exit(0);else { x=S->elem[S->top];printf("%d ",x); \/*打印*\/ S->top--; \/*修改栈顶指针*\/ } } ...

数据结构c语言版表达式求值标准程序
private:T *s; \/\/ 数组的首地址(栈底)size_t N; \/\/ 指向栈顶第一个空闲块 const size_t size; \/\/ 堆栈的大小,固定不变 public:stack(size_t n) : size(n){ s = new T[n]; \/\/ 可能抛出异常 N = 0; \/\/ 设置栈顶指针 } ~stack(){ delete [] s;} bool empty...

请大神用C语言帮编一个关于家谱的程序!要求:
void Push(sqstack &s,SElemType e)\/\/将元素压入堆栈 { s.top++=e;} Status CreateBiTree(BiTree &T){ \/\/按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树。\/\/构造二叉链表表示的二叉树T.char ch;ch=getche();if(ch==' ') T=NULL;else{ if(!(T=(BiTNode *)...

急!用c语言实现链栈的操作
int PopLinkStack (LinkStack* & s, ElemType &x){ LinkStack *p;if(s==NULL) return 0;x = s->data; \/*将栈顶数据存入*x *\/ p = s; \/*保存栈顶结点地址*\/ s = s->next; \/*删除原栈顶结点*\/ free (p); \/*释放原栈顶结点*\/ return 1; \/*返回新栈顶指针*\/ } (5)...

用VC实现堆栈!只要输入一串字符再打印出来就可以了
堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。有一个 地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程...

单片机程序中“PUSH 02H”和“POP 02”是什么意思?
POP OPRD 功能: 实现压入操作的指令是PUSH指令;实现弹出操作的指令是POP指令.说明: 1. OPRD为16位(字)操作数,可以是寄存器或存储器操作数.2. PUSH的操作过程是: (SP)<--(SP)-2,((sp))<--OPRD 即先修改堆栈指针SP(压入时为自动减2),然后,将指定 的操作数送入新的栈顶位置.此处的((SP...

一道汇编程序题
POP DPL ;压出堆栈指针,把当前指针的低位给DPL MOV DPTR,#4000H;(DPTR)=4000H,指针首指 RL A;A的值左移一位,02H左移变成04H MOV B,A ;(B)=04H MOVC A,@A+DPTR ;查表指令 A=(4004H)=30H PUSH A ;保护现场,把A的值压入堆栈,即A=04H MOV A,B; (4004H)=04H I...

程序解释
void main( ){ Stack S;\/\/声明一个栈 Char x,y;InitStack(S); \/\/栈的初始化 x=’c’;y=’k’;Push(S,x); \/\/将x压入栈顶,即栈顶元素为c Push(S,’a’); \/\/将'a'压入栈顶,栈中数据由底到顶(c,a)Push(S,y); \/\/将y压入栈顶,栈中数据由底到顶(c,a,k)Pop(S,...

相似回答