c语言栈操作库函数 C语言函数调用栈

数据结构实验(用c语言写) 栈的基本操作

//顺序栈

创新互联公司专注于射阳企业网站建设,响应式网站设计,商城开发。射阳网站建设公司,为射阳等地区提供建站服务。全流程按需规划网站,专业设计,全程项目跟踪,创新互联公司专业和态度为您提供的服务

#includestdio.h

#includestdlib.h

#includemalloc.h

#define STACK_INIT_SIZE 100;

#define STACKINCREMENT 10;

typedef struct

{

int *base;

int *top;

int stacksize;

}SqStack;

typedef int ElemType;

int InitStack(SqStack S) //为栈S分配存储空间,并置S为空栈

{

int size = STACK_INIT_SIZE;

S.base=(int *)malloc(size*sizeof(ElemType));

if(!S.base)

return 0;

S.top=S.base; //置栈S为空栈

S.stacksize=STACK_INIT_SIZE;

return 1;

}

int GetTop(SqStack S,int e) //若栈不空,则用e返回S的栈顶元素

{

if(S.top==S.base) return 0;

e=*(S.top-1);

return 1;

}

int Push(SqStack S, int e) /*进栈函数,将e插入栈S中,并使之成为栈顶元素*/

{ if(S.top-S.base=S.stacksize) /*栈满,追加存储空间*/

{

int stackinvrement = STACKINCREMENT;

S.base=(ElemType *) realloc(S.base,(S.stacksize+stackinvrement)*sizeof(ElemType));

if(!S.base)

return 0; /*存储分配失败*/

S.stacksize+=STACKINCREMENT;

}

*S.top++=e;

return 1;

}

int Pop(SqStack S,int e)/*出栈函数,若栈S不空,则删除S的栈顶元素,用e返回其值*/

{ if(S.top==S.base) return 0;

e=*--S.top;

return 1;

}

void OutputStack(SqStack S)

{int *q;

q=S.top-1;

for(int i=0;iS.top-S.base;i++)

{

printf("%3d ",*q);q--;}

}

void main()

{

int a,b,c ;

char m;

SqStack s;

InitStack(s);

printf("请输入要进栈的元素个数是:");

scanf("%d",a);

printf("\n请输入要进栈的%d个元素:",a);

for(b=0;ba;b++) {

scanf("%d",c);

Push(s,c); }

do { printf("\n");

printf("*********** 1.输出栈的元素**********\n");

printf("*********** 2.取栈顶元素************\n");

printf("*********** 3.删除栈顶元素**********\n");

printf("*********** 4.退出程序**********\n");

printf("\n请选择一个字符:");

getchar();

scanf("%c",m);

switch(m) {

case '1': printf("\n输出的栈为:");

OutputStack(s);

break;

case '2': GetTop(s,c);

printf("\n栈顶元素为:%d",c);

printf("\n输出的栈为:");

OutputStack(s);

break;

case '3': Pop(s,c);

printf("\n删除的栈顶元素:%d",c);

printf("\n输出的栈为:");

OutputStack(s);

printf("\n");

break;

case '4':break;

default: printf("输入的数字有错,请重新选择!\n"); break;

}

}while(m!='4');

}

//链栈

#includestdio.h

#includestdlib.h

typedef struct SNode

{

int data;

struct SNode *next;

}SNode,*LinkStack;

LinkStack top;

LinkStack PushStack(LinkStack top,int x) //入栈

{

LinkStack s;

s=(LinkStack)malloc(sizeof(SNode));

s-data=x;

s-next=top;

top=s;

return top;

}

LinkStack PopStack(LinkStack top) //退栈

{

LinkStack p;

if(top!=NULL)

{

p=top;

top=top-next;

free(p);

printf("退栈已完成\n");

return top;

}

else printf("栈是空的,无法退栈!\n"); return 0;

}

int GetStackTop(LinkStack top) //取栈顶元素

{

return top-data;

}

bool IsEmpty()//bool取值false和true,是0和1的区别,bool只有一个字节,BOOL为int型,bool为布尔型

{

return top==NULL ? true:false;

}

void Print()

{

SNode *p;

p=top;

if(IsEmpty())

{

printf("The stack is empty!\n");

return;

}

while(p)

{

printf("%d ", p-data);

p=p-next;

}

printf("\n");

}

void main()

{

int x,a,b;

char m;

do { printf("\n");

printf("###############链栈的基本操作##################\n");

printf("××××××××1.置空栈××××××××××\n");

printf("××××××××2.进栈×××××××××××\n");

printf("××××××××3.退栈×××××××××××\n");

printf("××××××××4.取栈顶元素××××××××\n");

printf("××××××××5.退出程序×××××××××\n");

printf("##############################################\n");

printf("\n请选择一个字符:");

scanf("%c",m);

switch(m){

case '1':

top=NULL;

printf("\n栈已置空!");

break;

case '2':

printf("\n请输入要进栈的元素个数是:");

scanf("%d",a);

printf("\n请输入要进栈的%d个元素:",a);

for(b=0;ba;b++) {

scanf("%d",x);

top=PushStack(top,x); }

printf("进栈已完成!\n");

printf("\n输出栈为:");

Print();

break;

case '3':

printf("\n操作之前的输出栈为:");

Print();

top=PopStack(top);

printf("\n操作过后的输出栈为:");

Print();

break;

case '4':

printf("\n输出栈为:");

Print();

if(top!=NULL)

printf("\n栈顶元素是:%d\n",GetStackTop(top));

else

printf("\n栈是空的,没有元素!");

break;

case '5':break;

default:

printf("\n输入的字符不对,请重新输入!");

break;

}

getchar();

}while(m!='5');

}

请问c语言有没有像c++一样的stack库函数?用来直接使用栈

C语言中包含一些标准的库函数,但是没有像C++中的STL容器那部分全面的结构和函数。

在C语言中如果想使用栈,需要自己编写代码,如果是简单的一次性应用,可以用数组模拟栈的功能,如果是在一个大项目中反复使用,可以自己写一个stack的库函数。

自定义的库函数中,至少应该包含初始化、销毁、入栈、出栈、取栈顶元素、判断栈是否为空等操作。

栈的c语言实现基本操作

写了一个链式栈,你看看

# 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;

}

}


网站题目:c语言栈操作库函数 C语言函数调用栈
分享地址:http://myzitong.com/article/doodiig.html