C语言顺序栈实现

S_Stack.h

#pragma once

#include <stdlib.h>
#include <stdio.h>

//栈数据类型
#define SElemType char
//栈初始大小
#define SSize 5
//栈扩容增量
#define SInc 5
//内存溢出异常
#define OVERFLOW -2
//错误
#define ERROR -1

//栈结构体
typedef struct S_Stack
{
	SElemType* base;
	SElemType* top;
	int StackSize;
} Stack;

//初始化栈
void InitStack(Stack& S);

//判断栈是否为空
bool EmptyStack(Stack S);

//清空栈
void ClearStack(Stack& S);

//销毁栈
void DestroyStack(Stack& S);

//获取栈长度
int StackLength(Stack S);

//获取栈顶地址
SElemType* GetTop(Stack S);

//压栈
void Push(Stack& S, SElemType e);

//弹栈
void Pop(Stack& S, SElemType& e);

//遍历栈元素
void StackTraverse(Stack s, void(*f)(SElemType e));



S_Stack.cpp

#include "S_Stack.h"
#include <stdlib.h>
#include <stdio.h>

//初始化栈
void InitStack(Stack& S) {
	S.base = (SElemType*)malloc(SSize * sizeof(SElemType));
	if(!S.base) exit(OVERFLOW);
	S.top = S.base;
	S.StackSize = SSize;
	printf("Stack Created,Size:%d Base Address:%p\n",S.StackSize,S.base);
}
//判断栈是否为空
bool EmptyStack(Stack S) {
	return S.top == S.base ? true : false;
}

//清空
void ClearStack(Stack& S) {
	//只需修改栈顶指针到基地址
	S.top = S.base;
}

//销毁栈
void DestroyStack(Stack& S) {
	free(S.base);
	S.base = S.top = NULL;
	S.StackSize = 0;
}

//获取栈长度
int StackLength(Stack S) {
	return S.top - S.base;
}

//获取栈顶地址
SElemType* GetTop(Stack S) {
	return S.top;
}

//压栈
void Push(Stack& S, SElemType e) {
	if (S.top - S.base >= S.StackSize) {
		//增加栈容量
		SElemType* newPStack = (SElemType*)realloc(S.base,(S.StackSize + SInc) * sizeof(SElemType));
		if (!newPStack) exit(OVERFLOW);
		S.base = newPStack;//realloc可能会重新分配基地址,top地址也需要重新计算
		S.top = S.base + S.StackSize;
		S.StackSize += SInc;
		printf("Stack Rebuild,Size:%d Base Address:%p\n", S.StackSize, S.base);
	}
	*S.top++ = e;
}

//弹栈
void Pop(Stack& S, SElemType& e) {
	if (EmptyStack(S)) exit(ERROR);
	e = *--S.top;
}

//遍历栈元素
void StackTraverse(Stack s, void(*f)(SElemType e)) {
	SElemType* P = s.top;
	while (P-->s.base)
	{
		f(*P);
	}
}

main.cpp(用于测试)

#include "S_Stack.h"
#include <stdio.h>
#include <string.h>

#define PUSH "push"
#define POP "pop"
#define EXIT "exit"

void PrintElem(SElemType e) {
	printf("%c\n",e);
}

int main() {

	Stack stack;
	InitStack(stack);
	char opt[10];
	SElemType e;
	while (1)
	{
		gets_s(opt, 10);
		if (strcmp(opt,EXIT)==0) {
			DestroyStack(stack);
			return 0;
		}
		if (strcmp(opt, PUSH)==0) {
			printf("wait for input:");
			e = getchar();
			getchar();
			Push(stack, e);
		}else if (strcmp(opt,POP)==0) {
			Pop(stack, e);
			printf("pop:%c\n", e);
		}else {
			printf("unknow operation\n");
			continue;
		}
		printf("stack:\n");
		StackTraverse(stack, PrintElem);
	}

	return 0;
}

执行结果:

Stack Created,Size:5 Base Address:00F852F8
push
wait for input:a
stack:
a
push
wait for input:b
stack:
b
a
push
wait for input:c
stack:
c
b
a
push
wait for input:d
stack:
d
c
b
a
push
wait for input:e
stack:
e
d
c
b
a
push
wait for input:f
Stack Rebuild,Size:10 Base Address:00F852F8
stack:
f
e
d
c
b
a
pop
pop:f
stack:
e
d
c
b
a

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用C语言顺序栈可以实现判断回文的功能。回文是指正读和反读都相同的字符串。下面是使用顺序栈实现判断回文的步骤: 1. 定义一个顺序栈结构,包括栈的容量、栈顶指针和存储元素的数组。 2. 初始化栈,将栈顶指针置为-1。 3. 将待判断的字符串依次入栈,直到字符串结束。 4. 从字符串的开头开始遍历,将每个字符出栈并与当前遍历的字符进行比较。 - 如果相等,则继续遍历下一个字符。 - 如果不相等,则说明不是回文,返回false。 5. 如果遍历完整个字符串,且栈为空,则说明是回文,返回true;否则,返回false。 下面是使用C语言实现判断回文的代码示例: ```c #include <stdio.h> #include <stdbool.h> #define MAX_SIZE 100 typedef struct { char data[MAX_SIZE]; int top; } Stack; void initStack(Stack* stack) { stack->top = -1; } bool isEmpty(Stack* stack) { return stack->top == -1; } bool isFull(Stack* stack) { return stack->top == MAX_SIZE - 1; } void push(Stack* stack, char c) { if (isFull(stack)) { printf("Stack is full.\n"); return; } stack->data[++stack->top] = c; } char pop(Stack* stack) { if (isEmpty(stack)) { printf("Stack is empty.\n"); return '\0'; } return->data[stack->top--]; } bool isPalindrome(char* str) { Stack stack; initStack(&stack); // 将字符串入栈 int i = 0; while (str[i] != '\0') { push(&stack, str[i]); i++; } // 判断是否为回文 i = 0; while (str[i] != '\0') { if (pop(&stack) != str[i]) { return false; } i++; } return isEmpty(&stack); } int main() { char str[MAX_SIZE]; printf("请输入一个字符串:"); scanf("%s", str); if (isPalindrome(str)) { printf("%s 是回文。\n", str); } else { printf("%s 不是回文。\n", str); } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值