栈是一种先进后出的数据结构,这里便不过多赘述。栈可以用数组实现,也可以用单链表实现。如果使用数组栈虽然比较方便但是由于数组大小是固定的,会造成一些问题。如果用单链表(从头部插入)实现栈结构,会比数组栈好一些。这里有一道数据结构水题http://helloc.openjudge.cn/xl/040/,就通过这个题来总结一下自己的学习成果。先直接上代码,代码如下:
#include#include #include typedef struct node{ int data; struct node*next;}stack,*linkstack;int pd(char *s){ if(strcmp(s,"push")==0) return 1; else return 0;}linkstack push(int t,stack*h){ stack *p; p=(linkstack)malloc(sizeof(stack)); p->data=t; p->next=h; return p;}linkstack pop(stack*h,int *flag){ if(h->next==NULL) { *flag=0; return h; } else { stack*p; p=h->next; free(h); return p; }}void f(stack *h){ if(h->next==NULL) return; else { f(h->next); printf("%d ",h->data); }}int main(){ int n,i,t,l,temp,flag; char s[10]; scanf("%d",&t); for(l=0;l next=NULL; scanf("%d",&n); for(i=0;i
先定义一个结构体,定义如下:
typedef struct node{ int data;//存放数据 struct node*next;//指向下一个结点}stack,*linkstack;//linkstack就相当于struck node*,stack相当于struck node
申请一个头结点,并使头结点指向的下一个结点为空:
stack *h;h=(linkstack)malloc(sizeof(stack));//申请一个头结点,头结点不存放任何数据,但头结点并不为NULLh->next=NULL;//使头结点的next指向为空
当输入push时:
linkstack push(int t,stack*h){ stack *p; p=(linkstack)malloc(sizeof(stack));//申请一个结点空间 p->data=t;//存放数据 p->next=h;//使该节点指向头结点 return p;//返回一个结构体指针,用于改变头指针指向;}
当输入pop时:
linkstack pop(stack*h,int *flag){ if(h->next==NULL)//如果当前头结点的next为空,说明栈已空 { *flag=0; return h; } else { stack*p; p=h->next;//使p指向当前头结点h指向的下一个结点啊 free(h);//释放内存 return p; }}
然后通过递归输出栈内元素:
void f(stack *h){ if(h->next==NULL)//当h指向的next为空时,说明栈已空 return; else { f(h->next); printf("%d ",h->data); }}