栈的基本操作和应用-数制转换

文章讲述了C++中顺序栈和链栈的数据结构实现,包括初始化、入栈、出栈和取栈顶元素的操作,以及如何利用它们进行进制转换示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

顺序栈

#include<iostream>
using namespace std;

#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int Status;
typedef int SElemType;

typedef struct {
	SElemType *base;
	SElemType *top;
	int stacksize;
}SqStack;

//初始化
Status InitStack(SqStack& S) {
	S.base = new SElemType[MAXSIZE];
	if (!S.base)exit(OVERFLOW);
	S.top = S.base;
	S.stacksize = MAXSIZE;
	return OK;
}

//入栈  
Status Push(SqStack& S, SElemType e) {
	if ((S.top - S.base) == S.stacksize) {
		delete[] S.base;
		S.base = new SElemType[2 * MAXSIZE];
		S.top = S.base + MAXSIZE - 1;
	}
	*S.top++ = e;
	return OK;
}

//出栈
Status Pop(SqStack& S, SElemType& e) {
	if (S.top == S.base)return ERROR;
	e = *--S.top;
	return OK;
}

//取栈顶元素
SElemType GetTop(SqStack S) {
	if (S.top = S.base)
		return *(S.top - 1);
}

//判断是非为空  
Status Empty_SqStack(SqStack S) {
	if (S.top == S.base) return OK; // 如果栈为空,返回OK  
	return ERROR; // 如果栈不为空,返回ERROR  
}
//进制转换
void Conversion()
{
	SqStack S;
	InitStack(S);
	int ten, N, elem;
	char a = 'A';//用A代替大于9的数
	cout << "输入你要转化的数(十进制)和你要转化成(N)进制的数:";
	cin >> ten >> N;
	elem = ten;
	while (ten)
	{
		Push(S, ten % N);
		ten = ten / N;
	}
	cout << "10进制数" << elem << "转化的" << N << "进制数如下:" << endl;
	while (!Empty_SqStack(S))
	{
		Pop(S, elem);
		if (elem > 9)
			cout << a + elem - 10;
		else
			cout << elem;
	}
	cout << endl;

}

int main() {
	while (1)
	{
Conversion();
	}
	
}

链式栈

/***链栈的实现***/
#include<iostream>
#include<fstream>
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int SElemType;

typedef struct StackNode {
	SElemType data;
	struct StackNode* next;
} StackNode, * LinkStack;

//算法3.5 链栈的初始化
Status InitStack(LinkStack& S) { // 构造一个空栈 S,栈顶指针置空
	S = NULL;
	return OK;
}

//算法3.6 链栈的入栈
Status Push(LinkStack& S, SElemType e) {//在栈顶插入元素e
	LinkStack p;
	p = new StackNode; //生成新结点
	p->data = e; //将新结点数据域置为e
	p->next = S; //将新结点插入栈顶
	S = p; //修改栈顶指针为p
	return OK;
}

//算法3.7 链栈的出栈
Status Pop(LinkStack& S, SElemType& e) {//删除S的栈顶元素,用e返回其值
	LinkStack p;
	if (S == NULL)
		return ERROR; //栈空
	e = S->data; //将栈顶元素赋给e
	p = S; //用p临时保存栈顶元素空间,以备释放
	S = S->next; //修改栈顶指针
	delete p; //释放原栈顶元素的空间
	return OK;
}
//算法3.8 取链栈的栈顶元素
SElemType GetTop(LinkStack S) {//返回S的栈顶元素,不修改栈顶指针
	if (S != NULL) //栈非空
		return S->data; //返回栈顶元素的值,栈顶指针不变
}




		int main() {
			int N, e,n;
			LinkStack S;
			while (1)
			{
				cout << "请输入十进制N的数值:(输入0结束程序)" << endl;
				cin >> N;
				if (N == 0)break;
				cout << "请输入你要转换的进制:" << endl;
				cin >> n;
				if (n == 1 || n == 0)break;
				// 初始化顺序栈
				if (InitStack(S)) {
					if (N == 0) {
						cout << N;
						return 1;
					}
					while (N) {
						Push(S, N % n);		// 模运算 取余
						N = N / n;
					}
					while (Pop(S, e)) {
						cout << e;
					}
					cout << endl;
				}
			}
		}
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值