重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
#include stdio.h
创新互联服务项目包括安陆网站建设、安陆网站制作、安陆网页制作以及安陆网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,安陆网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到安陆省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
#include stdlib.h
typedef struct _stack {
int size;
int* base;
int* sp;
} stack;
void init(stack* s, int n)
{
s-base = (int*)malloc(sizeof(int)*n);
s-size = n;
s-sp = s-base;
}
int push(stack* s, int val)
{
if(s-sp - s-base == s-size) {
puts("overflow");
exit(1);
}
return *s-sp++ = val;
}
int pop(stack* s)
{
if(s-sp == s-base) {
puts("underflow");
exit(2);
}
return *--s-sp;
}
int empty(stack* s)
{
return s-sp == s-base;
}
void clean(stack* s)
{
if(s-base)
free(s-base);
}
int main(void)
{
stack s;
int i;
init(s, 100);
for(i = 0; i 10; ++i)
printf("%d ", push(s, i));
putchar('\n');
while(!empty(s))
printf("%d ", pop(s));
clean(s);
return 0;
}
1.栈空间(stack段)用来存放函数中的局部变量和函数调用时的上下文。
2.
全局变量和静态变量存放于进程的数据段。
3.
windows下进程的栈空间会自动增长,一般不会出现空间不足的问题;
4。如果变量实在太大,甚至大于栈可增长的范围,如数百兆,则会编译出错。
1 思路: 主要是链表的插入和删除操作
2 代码
#includestdio.h
#includestdlib.h
typedef struct node
{
int data;
struct node *next;
}node_type;
void push(node_type* stack, int elem){
node_type*node = (node_type*)malloc(sizeof(node_type));
node-data = elem;
node-next = stack;
stack = node;
}
int pop(node_type* stack){
int elem = stack-data;
node_type*node = stack;
stack = stack-next;
free(node);
return elem;
}
bool IsEmpty(node_type* stack){
return stack == NULL;
}
void display(node_type*stack){
while (stack){
printf("%d ", stack-data);
stack = stack-next;
}
puts("");
}
void destroy(node_type*stack){
while (!IsEmpty(stack)){
pop(stack);
}
}
int main(){
puts("(1) 建立空链栈");
node_type*stack = NULL;
puts("\n(2) 调用进栈函数,将从键盘输入的数据元素逐个进栈,输入0结束;");
int num;
scanf("%d", num);
while (num != 0){
push(stack, num);
scanf("%d", num);
}
puts("\n(3) 显示进栈后的数据元素");
display(stack);
puts("\n(4) 调用两次出栈函数,显示出栈后的数据元素");
if (!IsEmpty(stack))
printf("%d\n", pop(stack));
if (!IsEmpty(stack))
printf("%d\n", pop(stack));
destroy(stack);
getchar();
getchar();
return 0;
}
3 运行效果
写了一个链式栈,你看看
# include stdio.h
# include malloc.h
# include stdlib.h
typedef struct Node
{
int data;
struct Node *pNext;
}NODE, *PNODE;
typedef struct Stack
{
PNODE pTop;
PNODE pBottom;//pBottem是指向栈底下一个没有实际意义的元素
}STACK, *PSTACK;
void init( PSTACK );
void push( PSTACK, int );
void traverse( PSTACK );
int pop( PSTACK, int * );
int empty( PSTACK pS );
int main( void )
{
STACK S;//STACK等价于struct Stack
int val;
init( S );//目的是造出一个空栈
push( S, 1 );//压栈
push( S, 2 );
push( S, 3 );
push( S, 4 );
push( S, 5 );
push( S, 6 );
push( S, 7 );
traverse( S );//遍历输出
// clear( S ); //清空数据
// traverse( S );//遍历输出
if( pop( S, val ) )
{
printf( "出栈成功,出栈的元素是%d\n", val );
}
else
{
printf( "出栈失败" );
}
traverse( S );//遍历输出出栈之后的元素
return 0;
}
void init( PSTACK pS )
{
pS-pTop = ( PNODE )malloc( sizeof( NODE ) );
if( NULL == pS-pTop )
{
printf( "动态内存分配失败!\n" );
exit( -1 );
}
else
{
pS-pBottom = pS-pTop;
pS-pTop-pNext = NULL;//或是pS-pBottom = NULL;
}
}
void push( PSTACK pS, int val )
{
PNODE pNew = ( PNODE )malloc( sizeof( NODE ) );
pNew-data = val;
pNew-pNext = pS-pTop;//pS-Top不能改为pS-pBottom
pS-pTop = pNew;
}
void traverse( PSTACK pS )
{
PNODE p = pS-pTop;
while( p != pS-pBottom )
{
printf( "%d ", p-data );
p = p-pNext;
}
printf( "\n" );
}
int empty( PSTACK pS )
{
if( pS-pTop == pS-pBottom )
return 1;
else
return 0;
}
//把pS所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中,如果出栈失败,则返回false,否则true
int pop( PSTACK pS, int *pVal)
{
if( empty( pS ) )//pS本身存放的就是S的地址
{
return 0;
}
else
{
PNODE r = pS-pTop;
*pVal = r-data;
pS-pTop = r-pNext;
free( r );
r = NULL; //为什么要把r赋给NULL呢??
return 1;
}
}
//clear清空
void clear( PSTACK pS )
{
if( empty( pS ) )
{
return ;
}
else
{
PNODE p = pS-pTop;
PNODE q = p-pNext;
while( p != pS-pBottom )
{
q = p-pNext;
free( p );
p = q;
}
pS-pTop = pS-pBottom;
}
}
#include"stdio.h"
#include"malloc.h"
#include"stdlib.h"
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
typedef char ElemType;
typedef int Status;
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
typedef struct
{
ElemType *base; //在栈构造和销毁之后,base的值为NULL
ElemType *top; //栈顶指针
int stacksize; //当前已分配的存储空间,以元素为单位
}SqStack;
// 构造一个空栈S
Status InitStack(SqStack S)
{
S.base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!S.base) //存储分配失败
exit (OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack
/////////////////// 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR /////
Status GetTop(SqStack S,ElemType e)
{
if(S.top==S.base)
return ERROR;
e=*(S.top-1);
return OK;
}//GetTop
////////////////// 插入元素e为新的栈顶元素 /////////////////////////////////////
Status Push(SqStack S,ElemType e)
{
if(S.top-S.base=S.stacksize) //栈满,追加存储空间
{
S.base=(ElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT) * sizeof(ElemType));
if(!S.base)
exit (OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}//Push
////////////////// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(SqStack S,ElemType e)
{
if(S.top==S.base)
return ERROR;
e=*--S.top;
return OK;
}//Pop
////////// main() //////////////////////////////
void main()
{
int i;
char ch,e,c;
SqStack S;
InitStack(S);
printf("1.Push\t2.Pop\t3.GetTop\t4.exit\n");
while(1)
{
printf("请选择:");
scanf("%d",i);
c=getchar(); //*****接受回车符******
switch (i)
{
case 1:
printf("请输入要插入的元素:");
scanf("%c",ch);
Push(S,ch);
break;
case 2:
printf("弹出栈顶元素:");
Pop(S,e);
printf("%c\n",e);
break;
case 3:
printf("取栈顶元素:");
GetTop(S,e);
printf("%c\n",e);
break;
case 4:
exit(0);
default:
printf("ERROR!Please Reput A Number\n");
}
}
}