复盘:栈
定义栈的结构体:
typedef struct
{
int stack[MaxStackSize];
int top;
}SequenceStack;
初始化栈:
void StackInit(SequenceStack *S)
{
S->top = -1;
}
判断空栈:
bool JudgeStackEmpty(SequenceStack *S)
{
if(S->top == -1)
return true;
else
return false;
}
进栈:
void StackPush(SequenceStack *S,int x)
{
if(S->top == MaxStackSize - 1){
printf("此时栈满");
}
else{
S->top++;
S->stack[S->top] = x;
printf("入栈成功");
}
}
出栈:
int StackPop(SequenceStack *S)
{
if(S->top == -1){
printf("此时为空栈,无法继续出栈");
return -1;
}
int x = S->stack[S->top];
S->top--;
return x;
}
取栈顶元素:
int GetStackTop(SequenceStack *S)
{
if(S->top == -1)
return -1;
int x = S->stack[S->top];
return x;
}
练习:数组模拟栈解决高精度加法
#include <stdio.h>
#define MAX_SIZE 1000 // 栈的最大大小
int top = -1; // 栈顶指针
int stack[MAX_SIZE]; // 栈
void push(int x) {
if (top >= MAX_SIZE - 1) { // 检查栈是否已满
printf("Error: Stack Overflow\n");
return;
}
top++; // 栈顶指针加1
stack[top] = x; // 入栈
}
int pop() {
if (top < 0) { // 检查栈是否为空
printf("Error: Stack Underflow\n");
return -1;
}
int x = stack[top]; // 获取栈顶元素
top--; // 栈顶指针减1
return x; // 返回栈顶元素
}
void printStack() {
printf("Stack: ");
for (int i = 0; i <= top; i++) {
printf("%d ", stack[i]); // 输出栈中所有元素
}
printf("\n");
}
void add(char* num1, char* num2) {
int carry = 0; // 进位
int n1 = strlen(num1), n2 = strlen(num2);
for (int i = n1 - 1, j = n2 - 1; i >= 0 || j >= 0 || carry > 0; i--, j--) {
int x = i >= 0 ? num1[i] - '0' : 0; // 如果num1已经加完了,就把x赋值为0
int y = j >= 0 ? num2[j] - '0' : 0; // 如果num2已经加完了,就把y赋值为0
push((x + y + carry) % 10); // 将当前位相加并加上进位,然后压入栈中
carry = (x + y + carry) / 10; // 计算进位
}
}
int main() {
char num1[] = "123456789";
char num2[] = "987654321";
add(num1, num2);
printStack();
return 0;
}