- 栈:是一种特殊的表,只在表头进行插入和删除。表首称为栈顶,表尾称为栈底。遵循先进后出原则。
- 因为只在表土进行插入和删除,只记录了表头,所以查找也是从表头开始的。
- 这些都是一些特殊化的表,所以关键理解表就掌握了这些特殊化的表了。
- 代码如下:
- `#include<stdio.h>
#include<stdlib.h>
typedef int ListItem;
typedef struct snode *Snode;
typedef struct snode{
ListItem element;
Snode next;//栈顶
}Simul;
typedef struct stack *Stack;
typedef struct stack{
Snode top;//栈顶
Snode curr;//用于查找元素的指针。
}Simul1;
Stack ListInit()
{
Stack L = (Stack)malloc(sizeof(* L));
L->top = NULL;
L->curr = NULL;
return L;
}
int IsEmpty(Stack L)
{
return L->top == NULL;
}
void ListTravel(Stack L)
{
L->curr = L->top;
while(L->curr!= NULL){
printf(" %d ",L->curr->element);
L->curr = L->curr->next;
}
}
int ListFind(Stack L,int k)//按位置查找
{
if(IsEmpty(L)) return 0;
int i = 1;
L->curr = L->top;
while(i<k){
L->curr = L->curr->next;
i++;
}
return L->curr->element;
}
int ListFound(Stack L,ListItem x)//按值查找
{
if(IsEmpty(L)) return 0;
int i = 1;
L->curr = L->top;
while(L->curr->element != x){
i++;
L->curr = L->curr->next;
}
return i;
}
void ListInsert(Stack L,ListItem x)//只能在栈顶插入
{
Snode K = (Snode)malloc(sizeof(* L));
K->element = x;
K->next = L->top; //注意这里的top不是栈中元素
L->top = K;
}
int ListDellete(Stack L)//只能在栈顶删除,所以只需要传递L即可
{
if(IsEmpty(L)) return 0;
L->top = L->top->next;
}
int main()
{
Stack L = ListInit();
ListInsert(L,1);
ListInsert(L,2);
ListInsert(L,3);
ListInsert(L,4);
ListTravel(L);
printf(" 3号位的值为 %d \n", ListFind(L,3));
printf(" 4号位的位置为 %d \n",ListFound(L,4));
ListDellete(L);
ListTravel(L);
}`
运行结果(这是修改前的结果,3号位的值应该为2,代码是正确的)