一、栈的定义:
1.栈:是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。
栈顶:线性表允许进行插入的那一端。
栈底:固定的,不允许进行插入和删除的那一端。
空栈:不含任何元素的空表。
栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。
2.栈的基本操作。
InitStack(&S):初始化一个空栈S。
StackEmpty(S):判断一个栈是否为空,若栈为空则返回true,否则返回false。
Push(&S,x):进栈(栈的插入操作),若栈S未满,则将x加入使之成为新栈项。
Push(&S,&x):出栈(栈的删除操作),若栈S非空,则弹出栈顶元素,并用x返回。
GetTop(S,&x):读栈顶元素,若栈S非空,则用x返回栈顶元素。
DestoryStack(&S):栈销毁,并释放S占用的储存空间(“&”表示引用调用)。
3.栈的顺序储存
采用顺序储存的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶元素的位置。
若存储栈的长度为StackSize,则栈顶位置top必须小于StackSize。当栈存在一个元素时,top=0,
因此常把空栈的判断条件定位top=-1。
二、队列的定义:
1.队列(queue)是只允许在一端进行插入操作,二在另一端进行删除操作的线性表。
队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头(又称队首)。
空队列:不包含任何元素的空表。
2.队列的基本操作
InitQueue(&Q):初始化队列,构造一个空队列Q。
QueueEmpty(Q):判断队列是否为空,若为空队列,则返回true,否则返回false。
EnQueue(&Q,x):入队,若队列Q未满,将x加入,使之成为新的队尾。
DeQueue(&Q,&x):出队,若队列Q非空,删除队头元素,并用x返回。
GetHead(Q,&x):读队头元素,若队列非空,则将队头元素赋值给x。
3.队列的存储顺序
队列的存储顺序实现是指分配一块连续的存储单元存放队列中的元素,并附设两个指针:
队头指针front 指向队头元素,队尾指针rear 指向队尾元素的下一个位置。
题目:
按照字典序输出自然数 11 到 nn 所有不重复的排列,即 nn 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入格式:
一个整数n。
输出格式:
由1~n 组成的所有不重复的数字序列,每行一个序列。
每个数字保留5个场宽。
样例:
输入:
3
输出:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#include <iostream>
using namespace std;
void swap(int &a,int &b){
int temp=a;
a=b;
b=temp;
}
void perm(int list[],int low,int high){
if(low==high){ //当low==high时,此时list就是其中一个排列,输出list
for(int i=0;i<=low;i++)
cout<<list[i];
cout<<endl;
}else{
for(int i=low;i<=high;i++){//每个元素与第一个元素交换
swap(list[i],list[low]);
perm(list,low+1,high); //交换后,得到子序列,用函数perm得到子序列的全排列
swap(list[i],list[low]);//最后,将元素交换回来,复原,然后交换另一个元素
}
}
}
int main()
{
int list[]={1,2,3};
perm(list,0,2);
return 0;
}