栈
栈是满足后进先出的一种数据结构,我这里是rear指针指向的栈顶不空的地方
想偷懒的同学可以用STL中的stack
#include <iostream>
#include <cstring>
using namespace std;
const int N = 10010;
int stk[N], rear;
void menu();
void init();
void destoryStack();
void clearStack();
bool stackEmpty();
int stackLength();
int getTop();
void push(int x);
int pop();
void traverse();
int main()
{
menu();
return 0;
}
void menu()
{
int tag = 0;
init();
while (tag != 9)
{
cout << "\t\t\t\t\t请输入您需要的操作\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t1、销毁栈\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t2、清空栈\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t3、判断是否为空栈\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t4、获取栈的长度\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t5、获取栈顶元素\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t6、压栈\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t7、删除栈顶元素\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t8、遍历栈\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t9、exit\t\t\t\t\t" << endl;
printf("请输入您要进行的操作:");
scanf("%d", &tag);
switch(tag)
{
case 1:
{
destoryStack();
break;
}
case 2:
{
clearStack();
break;
}
case 3:
{
if (stackEmpty() == true)
printf("Empty!\n");
else
printf("Unempty!\n");
break;
}
case 4:
{
printf("当前栈中元素的个数是%d\n", stackLength());
break;
}
case 5:
{
printf("当前栈顶元素为%d\n", getTop());
break;
}
case 6:
{
int x;
printf("请输入待插入的元素:");
scanf("%d", &x);
push(x);
break;
}
case 7:
{
printf("删除成功,删除的栈顶元素为%d\n", pop());
break;
}
case 8:
{
traverse();
break;
}
}
}
}
void init()
{
rear = -1;
}
void destoryStack()
{
memset(stk, 0, sizeof stk);
rear = -1;
}
void clearStack()
{
memset(stk, 0, sizeof stk);
rear = -1;
}
bool stackEmpty()
{
return rear == -1 ? true : false;
}
int stackLength()
{
return rear + 1;
}
int getTop()
{
return stk[rear];
}
void push(int x)
{
stk[++rear] = x;
}
int pop()
{
int res = stk[rear];
stk[rear--] = 0;
return res;
}
void traverse()
{
printf("自顶而下:");
int cur = rear;
while (cur != -1)
{
printf("%d ", stk[cur]);
cur--;
}
puts("");
}
队列
队列是一中先进先出的数据结构,在这里我们用数组来模拟,使用循环队列的思想。当然队列也可以用结构类型数据来实现,这里就不多赘述,更简单的是用STL容器中的queue
#include <iostream>
#include <cstring>
using namespace std;
const int N = 6; //最多存储5个元素的循环队列
int que[N], front, rear;
void menu();
void init();
void destoryQueue();
void clearQueue();
bool queueEmpty();
int queueLength();
int getTop();
void push(int x);
int pop();
void traverse();
int main()
{
menu();
return 0;
}
void menu()
{
int tag = 0;
init();
while (tag != 9)
{
cout << "\t\t\t\t\t请输入您需要的操作\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t1、销毁队列\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t2、清空队列\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t3、判断队列是否为空\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t4、获取队列的长度\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t5、获取队列队头元素\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t6、入队列\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t7、删除队头元素\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t8、遍历队列\t\t\t\t\t" << endl;
cout << "\t\t\t\t\t9、exit\t\t\t\t\t" << endl;
printf("请输入您要进行的操作:");
scanf("%d", &tag);
switch(tag)
{
case 1:
{
destoryQueue();
break;
}
case 2:
{
clearQueue();
break;
}
case 3:
{
if (queueEmpty() == true)
printf("Empty!\n");
else
printf("Unempty!\n");
break;
}
case 4:
{
printf("当前队列中元素的个数是%d\n", queueLength());
break;
}
case 5:
{
printf("当前队头元素为%d\n", getTop());
break;
}
case 6:
{
int x;
printf("请输入待插入的元素:");
scanf("%d", &x);
push(x);
break;
}
case 7:
{
printf("删除成功,删除的队头元素为%d\n", pop());
break;
}
case 8:
{
traverse();
break;
}
}
}
}
void init()
{
front = rear = 0;
}
void destoryQueue()
{
memset(que, 0, sizeof que);
front = rear = 0;
}
void clearQueue()
{
memset(que, 0, sizeof que);
front = rear = 0;
}
bool queueEmpty()
{
return front == rear ? true : false;
}
int queueLength()
{
return (rear - front + N) % N;
}
int getTop()
{
return que[front];
}
void push(int x)
{
que[rear] = x;
rear = (rear + 1) % N;
}
int pop()
{
int res = que[front];
que[front] = 0;
front = (front + 1) % N;
return res;
}
void traverse()
{
printf("当前队列:");
int cur = front;
while (cur != rear)
{
printf("%d ", que[cur]);
cur = (cur + 1) % N;
}
puts("");
}