栈和队列其实就是操作受限的队列。
1~~栈的特点:栈是限定仅在表的另一端(栈顶)进行插入,删除操作的线性表,是后进先出的线性表。
2~~顺序栈
(1)顺序栈的存储表示
typedef struct Node{ struct Node *base;//栈底指针,在栈构造之前和销毁之后,base的值为NULL struct Node *top;//这个是栈定指针,用以压栈的位置。 int size;//当前已分配的存储单元数,以元素为单位 }NODE,*PNODE;
(2) 压栈操作
int push(PNODE head,int e){ //插入元素为e的新的栈顶元素 if(head.top-head.base>=head.size)//栈满,追加存储空间{ head.base=(PNODE)malloc(sizeof(NODE)); if(head.base==NULL)//存储分配失败 exit(-1); head.top=head.base+head.size; head.size+=STACKINCREMENT; } *head.top++=e;//先传输据再移指针 return 1; }
(3)弹栈操作
int pop(PNODE head,int e){ //若栈不为空,则删除head的栈顶元素,用e返回其值 if(head.top==head.base) return 0; e=*--head.top;//先移指针再传数据 return 1; }
3~~链式栈
(1)链式栈的存储表示
typedef struct Lnode{ int data;//数据域 struct Lnode *next;//指针域 }NODE,*PNODE;
指向表头的指针为栈定指针
(2) 压栈操作
int push(PNODE head,int e){ phead=(PNODE)malloc(sizeof(NODE)); p->data=e; p->next=head.next; head.next=phead; }
(3) 弹栈操作
int pop(PNODE head,int e){ if(!head->next) return 0; phead=head->next; head->next=phead->next; e=phead->data; free(phead); return 1; }
时间: 2024-10-18 19:44:25