在编程世界中,数据结构是构建高效算法的基石。栈和队列作为两种基本的数据结构,它们的应用非常广泛。本文将带领大家使用C,C#和C++三种编程语言,通过数组来实现栈和队列,并提供详细的代码示例。
栈是一种后进先出(Last In First Out, LIFO)的数据结构。使用数组实现栈的基本思路如下:
#include
#include
#define MAX_SIZE 100
typedef struct Stack {
int data[MAX_SIZE];
int top;
} Stack;
void initializeStack(Stack *s) {
s->top = -1;
}
bool isFull(Stack *s) {
return s->top == MAX_SIZE - 1;
}
bool isEmpty(Stack *s) {
return s->top == -1;
}
void push(Stack *s, int value) {
if (isFull(s)) {
printf("栈已满,无法入栈\n");
return;
}
s->data[++s->top] = value;
}
int pop(Stack *s) {
if (isEmpty(s)) {
printf("栈为空,无法出栈\n");
return -1;
}
return s->data[s->top--];
}
int peek(Stack *s) {
if (isEmpty(s)) {
printf("栈为空\n");
return -1;
}
return s->data[s->top];
}
int main() {
Stack s;
initializeStack(&s);
push(&s, 10);
push(&s, 20);
printf("栈顶元素:%d\n", peek(&s));
printf("出栈元素:%d\n", pop(&s));
return 0;
}
using System;
public class Stack {
private int[] data;
private int top;
private int maxSize;
public Stack(int size) {
maxSize = size;
data = new int[maxSize];
top = -1;
}
public bool IsFull() {
return top == maxSize - 1;
}
public bool IsEmpty() {
return top == -1;
}
public void Push(int value) {
if (IsFull()) {
Console.WriteLine("栈已满,无法入栈");
return;
}
data[++top] = value;
}
public int Pop() {
if (IsEmpty()) {
Console.WriteLine("栈为空,无法出栈");
return -1;
}
return data[top--];
}
public int Peek() {
if (IsEmpty()) {
Console.WriteLine("栈为空");
return -1;
}
return data[top];
}
}
class Program {
static void Main() {
Stack s = new Stack(100);
s.Push(10);
s.Push(20);
Console.WriteLine("栈顶元素:" + s.Peek());
Console.WriteLine("出栈元素:" + s.Pop());
}
}
C++语言实现
#include
#include
using namespace std;
class Stack {
private:
vector<int> data;
int top;
int maxSize;
public:
Stack(int size) : maxSize(size), top(-1) {
data.resize(maxSize);
}
bool isFull() const {
return top == maxSize - 1;
}
bool isEmpty() const {
return top == -1;
}
void push(int value) {
if (isFull()) {
cout << "栈已满,无法入栈" << endl;
return;
}
data[++top] = value;
}
int pop() {
if (isEmpty()) {
cout << "栈为空,无法出栈" << endl;
return -1;
}
return data[top--];
}
int peek() const {
if (isEmpty()) {
cout << "栈为空" << endl;
return -1;
}
return data[top];
}
};
int main() {
Stack s(100);
s.push(10);
s.push(20);
cout << "栈顶元素:" << s.peek() << endl;
cout << "出栈元素:" << s.pop() << endl;
return 0;
}
队列是一种先进先出(First In First Out, FIFO)的数据结构。使用数组实现队列的基本思路如下:
#include
#include
#define MAX_SIZE 100
typedef struct Queue {
int data[MAX_SIZE];
int front;
int rear;
} Queue;
void initializeQueue(Queue *q) {
q->front = 0;
q->rear = 0;
}
bool isFull(Queue *q) {
return (q->rear + 1) % MAX_SIZE == q->front;
}
bool isEmpty(Queue *q) {
return q->rear == q->front;
}
void enqueue(Queue *q, int value) {
if (isFull(q)) {
printf("队列已满,无法入队\n");
return;
}
q->data[q->rear] = value;
q->rear = (q->rear + 1) % MAX_SIZE;
}
int dequeue(Queue *q) {
if (isEmpty(q)) {
printf("队列为空,无法出队\n");
return -1;
}
int value = q->data[q->front];
q->front = (q->front + 1) % MAX_SIZE;
return value;
}
int front(Queue *q) {
if (isEmpty(q)) {
printf("队列为空\n");
return -1;
}
return q->data[q->front];
}
int main() {
Queue q;
initializeQueue(&q);
enqueue(&q, 10);
enqueue(&q, 20);
printf("队首元素:%d\n", front(&q));
printf("出队元素:%d\n", dequeue(&q));
return 0;
}
using System;
public class Queue {
private int[] data;
private int front;
private int rear;
private int maxSize;
public Queue(int size) {
maxSize = size;
data = new int[maxSize];
front = 0;
rear = 0;
}
public bool IsFull() {
return (rear + 1) % maxSize == front;
}
public bool IsEmpty() {
return rear == front;
}
public void Enqueue(int value) {
if (IsFull()) {
Console.WriteLine("队列已满,无法入队");
return;
}
data[rear] = value;
rear = (rear + 1) % maxSize;
}
public int Dequeue() {
if (IsEmpty()) {
Console.WriteLine("队列为空,无法出队");
return -1;
}
int value = data[front];
front = (front + 1) % maxSize;
return value;
}
public int Front() {
if (IsEmpty()) {
Console.WriteLine("队列为空");
return -1;
}
return data[front];
}
}
class Program {
static void Main() {
Queue q = new Queue(100);
q.Enqueue(10);
q.Enqueue(20);
Console.WriteLine("队首元素:" + q.Front());
Console.WriteLine("出队元素:" + q.Dequeue());
}
}
#include
#include
using namespace std;
class Queue {
private:
vector<int> data;
int front;
int rear;
int maxSize;
public:
Queue(int size) : maxSize(size), front(0), rear(0) {
data.resize(maxSize);
}
bool isFull() const {
return (rear + 1) % maxSize == front;
}
bool isEmpty() const {
return rear == front;
}
void enqueue(int value) {
if (isFull()) {
cout << "队列已满,无法入队" << endl;
return;
}
data[rear] = value;
rear = (rear + 1) % maxSize;
}
int dequeue() {
if (isEmpty()) {
cout << "队列为空,无法出队" << endl;
return -1;
}
int value = data[front];
front = (front + 1) % maxSize;
return value;
}
int front() const {
if (isEmpty()) {
cout << "队列为空" << endl;
return -1;
}
return data[front];
}
};
int main() {
Queue q(100);
q.enqueue(10);
q.enqueue(20);
cout << "队首元素:" << q.front() << endl;
cout << "出队元素:" << q.dequeue() << endl;
return 0;
}
本文通过C、C#和C++三种语言的示例,详细介绍了如何使用数组来实现栈和队列这两种基本的数据结构。通过这些示例,我们可以看到,虽然不同的编程语言有着不同的语法和特性,但它们在实现基本数据结构时的核心思想和步骤是相似的。
在实际应用中,数组实现的栈和队列可能在性能上不是最优的选择,特别是在动态调整大小或者频繁进行插入和删除操作时。但是,它们是理解更复杂数据结构和算法的基础,也是锻炼编程技能的良好起点。