http://blog.csdn.net/jwentao01/article/details/46765517###;
栈基本概念:
栈(stack)是限定在表尾进行插入和删除操作的线性表(或单链表)。
//只能在一段进行插入和删除,因此不存在,在中间进行插入
栈顶(top):允许插入和删除的一端。而另一端称为栈底(bottom)
空栈:不含任何数据元素的栈。
后进先出
两个基本操作:
栈的插入操作(push),叫做进栈,或压栈,或入栈
删除操作(pop),叫做出栈,或弹栈
注意链栈next指针的指向,与队列不同:
如果插入一个元素,它的next指针是指向前一个已经在栈中的元素的
而队列则是,插入一个元素,其next指针是往外指,指向空。
链栈的next指针之所以这样,是方便删除操作,这一点可以在编程的过程中体会到。
以下是代码:
#include <iostream>using namespace std;typedef struct node{int data;struct node *next;
}Node;typedef struct stack{Node *top; /**书本写法是:加一个bottom,个人感觉没什么用,反而加一个count用于表示节点数会更好*/int count;
}Link_Stack;/**创建一个空栈*/
Link_Stack * Creat_stack()
{Link_Stack *p;p = new Link_Stack; /**这一步不要忘!需要给p创建空间*/p->count = 0;p->top = NULL;return p;
}/**入栈操作:push*/
Link_Stack * Push_stack(Link_Stack *p,int elem)
{if(NULL == p)return NULL;Node *temp;temp = new Node;temp->data = elem;temp->next = p->top; /**注意这里和队列的入队操作不同,next指向不同,为了方便出栈操作*/p->top = temp;p->count += 1;return p;
}/**出栈操作:pop*/
Link_Stack * Pop_stack(Link_Stack *p)
{Node *temp;temp = p->top;if(NULL == p->top){cout << "The stack is empty." << endl;return p;}else{p->top = p->top->next; /** temp = temp->next; 千万不能这么写,看看下一步是什么?*/delete temp;p->count -= 1;return p;}
}/**栈的遍历:输出栈*/
int Show_stack(Link_Stack *p)
{Node *temp;temp = p->top;if(NULL == p->top){cout << "The stack is empty." << endl;return 0;}while(NULL != temp){cout << temp->data << ' ';temp = temp->next;}cout << endl;return 0;
}int main()
{int i = 5;int elem;Link_Stack *p;p = Creat_stack();while(i--){cin >> elem;Push_stack(p,elem);}cout << "空栈插入5个元素后:" << endl;Show_stack(p);cout << "删除3个元素后:" << endl;for(i = 3;i--;){Pop_stack(p);}Show_stack(p);cout << "count:" << p->count << endl;cout << "删除2个元素后:" << endl;for(i = 2;i--;){Pop_stack(p);}Show_stack(p);cout << "count:" << p->count << endl;Push_stack(p,6);cout << "插入元素6后:" << endl;Show_stack(p);cout << "count:" << p->count << endl;return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
结果如下:
/点滴积累,我的一小步O(∩_∩)O~/